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