Bootstrap

当顺序表遇上STL函数:一场高效的替代之旅

当顺序表遇上STL函数:一场高效的替代之旅
//1.创建vector
vector 的底层就是⼀个会⾃动扩容的顺序表,其中创建以及增删查
改等等的逻辑已经实现好了,并且也完成了封装。

#include <vector> // 头⽂件
const int N = 20;
struct node
{
	int a, b, c;
};
void init()
{
	vector<int> a1; // 创建⼀个空的可变⻓数组
    vector<int> a2(N); // 指定好了⼀个空间,⼤⼩为 N
    vector<int> a3(N, 10); // 创建⼀个⼤⼩为 N 的 vector,并且⾥⾯的所有元素都是 10
    vector<int> a4 = {1, 2, 3, 4, 5}; // 使⽤列表初始化,创建⼀个 vector
    // <> ⾥⾯可以放任意的类型,这就是模板的作⽤,也是模板强⼤的地⽅
    // 这样,vector ⾥⾯就可以放我们接触过的任意数据类型,甚⾄是 STL
    vector<string> a5; // 放字符串
    vector<node> a6; // 放⼀个结构体
    vector<vector<int>> a7; // 甚⾄可以放⼀个⾃⼰,当成⼀个⼆维数组来使⽤。并且每⼀维都是可变的
    vector<int> a8[N]; // 创建 N 个 vector
}

//2.size/empty

  1. size :返回实际元素的个数;
  2. empty :返回顺序表是否为空,因此是⼀个 bool 类型的返回值。
    a. 如果为空:返回true
    b. 否则,返回false
void test_size()
{
    // 创建⼀个⼀维数组
    vector<int> a1(6, 8);
    for (int i = 0; i < a1.size(); i++)
    {
        cout << a1[i] << " ";
    }
    cout << endl << endl;
    // 创建⼀个⼆维数组
    vector<vector<int>> a2(3, vector<int>(4, 5));
    for (int i = 0; i < a2.size(); i++)
    {
        // 这⾥的 a2[i] 相当于⼀个 vector<int> a(4, 5)
        for (int j = 0; j < a2[i].size(); j++)
        {
            cout << a2[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl << endl;
}

//3.begin/end

  1. begin :返回起始位置的迭代器(左闭);
  2. end :返回终点位置的下⼀个位置的迭代器(右开);
    利⽤迭代器可以访问整? vector ,存在迭代器的容器就可以使⽤范围 for 遍历
void test_it()
{
    vector<int> a(10, 1);
    // 迭代器的类型是 vector<int>::iterator,但是⼀般使⽤ auto 简化
    for (auto it = a.begin(); it != a.end(); it++)
    {
   cout << *it << " ";
    }
    cout << endl << endl;
    //范围 for 遍历
    for (auto x : a)
    {
        cout << x << " ";
    }
    cout << endl << endl;
}

//4.push_back/pop_back

  1. push_back :尾部添加⼀个元素
  2. pop_back :尾部删除⼀个元素
void print(vector<int>& a)
{
    for (auto x : a)
    {
        cout << x << " ";
    }
    cout << endl;
}

void test_io()
{
    vector<int> a;
    // 尾插 1 2 3 4 5
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    a.push_back(4);
    a.push_back(5);
    print(a);
    // 尾删 3 次
    a.pop_back();
    a.pop_back();
    a.pop_back();
    print(a);
}

//5.front/back

  1. front :返回⾸元素;
  2. back :返回尾元素;
void test_fb()
{
    vector<int> a(5);
    for (int i = 0; i < 5; i++)
    {
        a[i] = i + 1;
    }
    cout << a.front() << " " << a.back() << endl;
}

//6.resize
• 修改 vector 的⼤⼩。
• 如果⼤于原始的⼤⼩,多出来的位置会补上默认值,⼀般是 0 。
• 如果⼩于原始的⼤⼩,相当于把后⾯的元素全部删掉。

void print(vector<int>& a)
{
    for (auto x : a)
    {
        cout << x << " ";
    }
    cout << endl;
}
void test_resize()
{
    vector<int> a(5, 1);
    a.resize(10); // 扩⼤
    print(a);
    a.resize(3); // 缩⼩
    print(a);
}

//7.clear
• 清空 vector

void print(vector<int>& a)
{
    for (auto x : a)
    {
        cout << x << " ";
    }
    cout << endl;
}

void test_clear()
{
    vector<int> a(5, 1);
    print(a);
    a.clear();
    cout << a.size() << endl;
    print(a);
}
;