Vector 是在堆中分配了一段连续的内存空间来存放元素。
常用的迭代器:
1. begin:成员返回指向第一个元素的迭代器;
2. end:成员返回容器最后一个元素的下一个位置(one past the end)
常用的操作:
1. empty():如果为空则返回true,否则返回false;
2. size():返回容器中元素的个数
3. push_back(val) 向vector的尾端添加值为val的元素
4. pop_back(val):删除尾元素,返回void。
5. v[n]:返回v中第n个位置上元素的引用,不能用下标操作添加元素。
6. back():返回容器中最后一个元素的引用。
7. front():返回容器中第一个元素的引用。
8. insert(p, n, val) :在迭代器 p 之前插入 n 个值为 val 的元素,返回新添加的第一个元素的迭代器。
9. erase(p) :删除迭代器 p 所指的元素,返回指向被删除元素之后元素的迭代器。
erase(b, e) :删除迭代器 b, e 之间的元素,返回指向最后一个被删除元素之后元素的迭代器。
10. sort():按输入序列的字典序升序排序,原为操作,无返回值函数原型:
void std::sort<std::vector<int>::iterator> (std::vector<int>::iterator, std::vector<int>::iterator);
11.unique():消除相邻的重复元素,该函数将输入序列相邻的重复项”消除“,返回一个指向不重复值范围末尾的迭代器,一般配合sort()使用
std::vector<int>::iterator std::unique<std::vector<int>::iterator>(std::vector<int>::iterator, std::vector<int>::iterator)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
vector<int> a{5,5,6,8,2,4,3,6,4};
sort(a.begin(), a.end()); // 先排序
for(int i:a)
cout << i << " " ; // 输出
cout << endl;
auto end_unique = unique(a.begin(), a.end()); //将输入序列相邻的重复项“消除”,返回一个指向不重复值范围末尾的迭代器
a.erase(end_unique, a.end()); // 删除末尾元素
for(int i:a)
cout << i << " "; // 输出
return 0;
}
12. 逆序reverse() ,原位操作,将容器内容逆向排列
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
vector<int> a{1,2,3,4,5,6,7};
reverse(a.begin(), a.end()); // 原位逆序排列
for(int i:a) cout << i << " "; // 输出
return 0;
}
输出为 7 6 5 4 3 2 1
13. 获取最大值元素:max_element(v.begin, v,end()) 返回最大值的迭代器
14.获取最小值元素:min_element(v.begin, v,end()) 返回最小值的迭代器
15. 获取两个元素之间的相对距离:distance(x, y), x, y是迭代器类型,返回x,y之间的距离、
vector的扩容过程:
如果集合已满,在新增数据的时候,就要分配一块更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素,所以对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了
size()和capacity()
vector有两个函数,⼀个是capacity(),在不分配新内存下最多可以保存的元素个数,另⼀个size(),返回当前已经存 储数据的个数。
resize()和reserve()
resize():改变当前容器内含有元素的数量(size()),⽽不是容器的容量
1. 当resize(len)中len>v.capacity(),则数组中的size和capacity均设置为len;
2. 当resize(len)中len<=v.capacity(),则数组中的size设置为len,⽽capacity不变;
reserve():改变当前容器的最⼤容量(capacity)
1. 如果reserve(len)的值 > 当前的capacity(),那么会重新分配⼀块能存len个对象的空间,然后把之前的对象通过 copy construtor复制过来,销毁之前的内存;
2. 当reserve(len)中len<=当前的capacity(),则数组中的capacity不变,size不变,即不对容器做任何改变。