目录
一、vector容器的介绍
二、vector容器的使用
1.vector的构造函数
2.vector的赋值操作
3.vector的容量与大小
4.vector的插入和删除
5.vector的数据存取
6.vector的互换容器
7.算法模块在vector的应用
①find算法(std)
②sort算法(std)
一、vector容器的介绍
引用的头文件:#include<vector>
vector是C++ STL中的一个容器,它是一个动态数组,可以进行元素的插入和删除,在此过程中,vector会动态调整所占用的内存空间,整个过程无需手动干预。vector容器是一个封装了动态大小数组的顺序容器,能够存放各种类型的对象(包括自定义类型)。vector容器中的元素按照严格的线性顺序排序。vector容器的空间是动态增长的。
能够存放各种类型的对象:
如:vector<string> v1;
vector<list<int>> v2;
vector<string> s = {"a", "aa", "aaa"};
动态增长:当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
按照严格的线性顺序排序:允许使用容器时,进行随机访问。
通常,使用 vector 容器是最好的选择,除非你有很好的理由选择其他容器。
二、vector容器的使用
1.vector的构造函数
vector<T>; // 使用模板类,默认构造函数
vector<T>{a, b, c, ...}; // 包含了初始值个数的元素
vector<T> = {a, b, c, ...}; // 等价于vector<T>{a, b, c, ...};
vector<T>(v.begin(), v.end()); // 将[v.begin(),v.end())区间中的元素拷贝给本身
vector<T>(n, elem); // 将n个elem拷贝给本身
vector<T>(const vector &v); // 拷贝构造函数
使用如下:
// ...
using namespace std;
// ...
void PrintVector(const vector<int>& v)
{
for (auto& e : v)
{
cout << e << " ";
}
}
// ...
vector<int> v1;
vector<int> v2(4, 2);
vector<int> v3(v2);
vector<int> v4{1, 2, 3, 4, 5};
PrintVector(v3);
// ...
输出结果:
2
2
2
2
2.vector的赋值操作
vector& operator=(const vector &v); // 重载赋值运算符
assign(v.begin(),v.end()); // 将[v.begin(),v.end())区间中的元素赋值给本身
assign(n,elem); // 将n个elem赋值给本身
使用如下:
void text02()
{
vector<int> v1,v2;
for (int i = 0; i < 5; ++i)
{
v1.push_back(i);
}
v2 = v1; // 赋值运算符重载
vector<int> v3,v4;
v3.assign(v1.begin(), v1.end()); // 区间赋值
v4.assign(5, 9);
cout << "打印v2: ";
PrintVector(v2);
cout << "打印v3: ";
PrintVector(v3);
cout << "打印v4: ";
PrintVector(v4);
}
3.vector的容量与大小
empty();
// 判断容器是否为空,为空返回1,否则返回0
capacity();
// 返回容器的容量
size();
// 返回容器的大小,即容器中元素的个数
reserve();
// 预分配vector的内存空间大小
resize(int num);
// 改变vector的size为num,若容器变长,则以默认值0填充新位置,如果容器变短,则末尾超过容器长度的元素被删除
resize(int num,int elem);
// 改变vector的size为num,若容器变长,则以elem填充新位置,如果容器变短,则末尾超过容器长度的元素被删除
注:
reserve函数若分配小于当前的容量大小则不进行任何操作。
注:capacity的代码在 vs 和 g++ 下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。这个问题经常会考察,不要固化的认为,顺序表增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。
4.vector的插入和删除
push_back(elem); // 尾部插入元素elem
pop_back(); // 删除最后一个元素
insert(const_iterator pos, elem); // 在迭代器指向的位置pos处插入一个元素elem
insert(const_iterator pos, int count, elem); // 在迭代器指向的位置pos处插入count个元素elem
erase(const_iterator pos); // 删除迭代器指向的元素
erase(const_iterator begin, const_iterator end); // 删除迭代器[begin, end)之间的元素
clear(); // vector的size将变成0,但是它的容量capacity并未发生改变
迭代器:
迭代器失效问题:
会引起其底层空间容量改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等。
注意更新迭代器变量
使用如下:
//...
vector<int> v4{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
v4.push_back(10);
v4.push_back(11);
v4.pop_back();
v4.pop_back();
v4.insert(v4.begin() + 1, 3,345);
v4.erase(v4.begin() + 7, v4.end());
PrintVector(v4);
//...
输出结果:
1 345 345 345 2 3 4
5.vector的数据存取
at(int idx); // 返回索引idx所指的数据
operator[]; // 返回[]内索引所指的数据
front(); // 返回容器中第一个元素
back(); // 返回容器中最后一个元素
6.vector的互换容器
swap(v); // 容器v和当前容器互换
7.算法模块在vector的应用
①find算法(std)
template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& val)
{
while (first != last)
{
if (*first == val) return first;
++first;
}
return last;
}
注:find未找到,则返回迭代器类型对象v.end()。
代码演示:
//...
vector<int> v4{ 9, 8, 7, 10, 6, 5, 4, 11, 3, 2, 1 };
v4.insert(v4.begin() + 1, 2,345);
vector<int>::iterator pos = find(v4.begin(), v4.end(), 4);
if (pos != v4.end())
{
v4.erase(pos);
}
PrintVector(v4);
//...
输出结果:
9 345 345 8 7 10 6 5 11 3 2 1
②sort算法(std)
引用的头文件:#include<algorithm>
default (1):
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);
custom (2):
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
代码演示:
//...
vector<int> v4{ 9, 8, 7, 10, 6, 5, 4, 11, 3, 2, 1 };
v4.insert(v4.begin() + 1, 2,345);
vector<int>::iterator pos = find(v4.begin(), v4.end(), 4);
if (pos != v4.end())
{
v4.erase(pos);
}
sort(v4.begin(), v4.end());
PrintVector(v4);
//...
输出结果:
1 2 3 5 6 7 8 9 10 11 345 345