vector表现出来的是一个大小可变、内存连续的数组。
类模板定义:
template <typename T, typename Allocator = allocator<T> >
class vector;
vector支持下列操作:
操作 | 作用 |
---|---|
vector c | 默认构造函数,构造一个没有任何元素的空vector |
vector c(c2) | 复制构造函数 |
vector c(rv) | 移动构造函数 |
vector c(n) | 构造一个大小为n的vector,对元素进行值初始化 |
vector c(n, elem) | 构造一个大小为n的vector,用elem对元素进行初始化 |
vector c(beg, end) | 构造一个vector,以区间[beg, end)对元素进行初始化 |
vector c(initlist) | 构造一个vector,用初值列对元素进行初始化 |
c.empty() | 判断容器是否为空 |
c.size() | 获取元素个数 |
c.max_size() | 元素个数最大可能值 |
c.capacity() | 容器大小 |
c.reserve(num) | 为容器保留num个元素的内存 |
==、!=、<、>、<=、>= | 比较元素 |
c = c2 | 赋值 |
c = rv | 移动语义赋值 |
c = initlist | 用初值列赋值 |
c.assign(n, elem) | 将n个elem赋值给c |
a.assign(beg, end) | 将区间[beg,end)的元素对c赋值 |
c1.swap(c2) | 交换c1、c2数据 |
swap(c1,c2) | 交换c1、c2数据 |
c[idx] | 随机访问,不检查范围 |
c.at(idx) | 随机访问,超出范围抛出 out_of_range 异常 |
c.front() | 返回第一个元素,不检查元素是否存在 |
c.back() | 返回最后一个元素,不检查元素是否存在 |
c.begin() | 指向第一个元素的随机读写迭代器 |
c.end() | 指向最后元素下一位置的随机读写迭代器 |
c.cbegin() | 指向第一个元素的随机只读迭代器 |
c.cend() | 指向最后元素下一位置的随机只读迭代器 |
c.rbegin() | 指向最后元素的反向随机读写迭代器 |
c.rend() | 指向第一个元素前一位置的反向随机读写迭代器 |
c.crbegin() | 指向最后元素的反向随机只读迭代器 |
c.crend() | 指向第一个元素前一位置的反向随机只读迭代器 |
c.push_back(elem) | 把elem追加到末尾 |
c.pop_back() | 移除最后一个元素,不返回 |
c.insert(pos, elem) | 在pos位置前插入元素elem,返回指向新元素的迭代器 |
c.insert(pos, n, elem) | 在pos位置前插入n个元素elem,返回指向第一个新元素的迭代器 |
c.insert(pos, beg, end) | 在pos位置前插入区间[beg,end)内的元素,返回指向第一个新元素的迭代器 |
c.insert(pos, initlist) | 在pos位置前插入初值列中元素,返回指向第一个新元素的迭代器 |
c.emplace(pos, args…) | 在pos位置前插入一个以args为初值的元素,返回指向新元素位置的迭代器 |
c.emplace_back(args…) | 追加一个以args为初值的元素 |
c.erase(pos) | 删除pos位置上元素,返回下一个元素的位置 |
c.erase(beg, end) | 删除[beg, end)区间内所有元素,返回下一个元素位置 |
c.resize(num) | 将元素数量改为num,对新增元素进行默认值初始化 |
c.resize(num, elem) | 将元素数量改为num,用elem对新增元素进行初始化 |
c.clear() | 删除所有元素 |
1、和array不用,vector的默认构造函数只会构造一个空的vector。而构造函数vector<> c(n)会构造一个具有n个元素的vector,并对每一个元素进行值初始化。对于默认构造函数比较耗时的类型,可以考虑先用reserve()分配足够内存,在需要时再进行元素初始化。
2、如果reserve()申请的空间比当前还小,那么函数不会起作用,也就是reserve()不能减小容器的容量。但是swap()函数在交换数据的同时会交换两个容器的容量。
实际上,vector内部也是用一段连续的内存来存储元素,swap()函数只是交换了两块内存的指针,所以同时也交换了容器的容量:
vector<int> a1 = { 1, 2, 3 };
vector<int> a2 = { 3, 2, 1, 0 };
auto b = a1.begin();
auto e = a1.end();
cout << "before swap: " << endl;
cout << "a1 ptr: " << a1.data() << endl;
cout << "a2 ptr: " << a2.data() << endl;
cout << "a1 size: " << a1.size() << endl;
cout << "a2 size: " << a2.size() << endl;
a1.swap(a2);
cout << "after swap: " << endl;
cout << "a1 ptr: " << a1.data() << endl;
cout << "a2 ptr: " << a2.data() << endl;
cout << "a1 size: " << a1.size() << endl;
cout << "a2 size: " << a2.size() << endl;
while (b != e)
{
cout << *b << endl;
b++;
}
另外,swap()函数不会令迭代器失效,只是访问的容器改变了。我的理解是,迭代器和容器没有绑定关系,而是和元素对象绑定。只有迭代器指向的元素对象改变了,迭代器才会失效。
vector<int> a;
a.reserve(5);
a.push_back(0);
a.push_back(1);
a.push_back(3);
a.push_back(4);
auto iter = a.begin() + 2;
cout << "addr1: " << iter._Ptr << endl;
cout << "addr2: " << a.insert(iter, 2)._Ptr << endl;
cout << "addr3: " << iter._Ptr << endl;
cout << *iter << endl; // error
代码中输出addr1、addr2 和 addr3 是同一个内存地址。但是,insert操作后,迭代器iter指向对象改变了所以失效了。