vector 包含在头文件< vector >中:
#include <vector>
在此头文件内,类型 vector 是一个定义于 namespace std 内的 template:
namespace std {
template <typename T,
typename Allocator = allocator<T> >
class vector;
}
Vector 的元素可以是任意类型 T。可有可无的第二个 template 参数用来定义内存模型。默认的内存模型是 C++ 标准库提供的 allocator。
模板类 vector 类似于 string 类,也是一种动态数组。可以在运行阶段设置 vector 对象的长度,可在末尾附加新数据,还可以在中间插入新数据。基本上,它是使用 new 创建动态数组的替代品。
vector 构造
操作 | 描述 |
---|---|
vector< Elem > c | Default 构造函数,产生一个空 vector,没有任何元素 |
vector< Elem > c(c2) | Copy 构造函数,建立 c2 的同型 vector 并成为 c2 的一份铂贝(所有元素都被复制) |
vector< Elem > c = c2 | Copy 构造函数,建立一个新的 vector 作为 c2 的拷贝(每个元素都被复制) |
vector< Elem > c = rv | Move 构造函数,建立一个新的 vector,取 rvalue rv 的内容(始自C++11) |
vector< Elem > c(n) | 利用元素的 default 构造函数生成一个大小为 n 的 vector |
vector< Elem > c(n, elem) | 建立一个大小为 n 的 vector,每个元素值都是 elem |
vector< Elem > c(beg, end) | 建立一个 vector,以区间 [beg, end) 作为元素初值 |
vector< Elem > c(initlist) | 建立一个 vector,以初值列 initlist 的元素为初值(始自C++11) |
vector< Elem > c = initlist | 建立一个 vector,以初值列 initlist 的元素为初值(始自C++11) |
c.~vector() | 销毁所有元素,释放内存 |
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> c;//创建一个空vector
vector<int> c1(20);//创建一个大小为20的vector
vector<int> c2(20, 1);//创建一个大小为20,每个元素值都是1的vector
int n = 10;
vector<int> c3(n);//创建一个大小为n的vector
int a[5] = {1, 2, 3, 4, 5};
vector<int> c4(a, a + 5);//复制[a, a + 5)之间的元素到vector
vector<int> c5{1, 2, 3, 4, 5};
vector<int> c6 = {1, 2, 3, 4, 5};
vector< vector<int> > c7(8, vector<int> (12, 0));//二维数组
return 0;
}
vector 非更易型操作
操作 | 描述 |
---|---|
c.empty() | 返回是否容器为空(相当于 size() == 0 但也许较快) |
c.size() | 返回目前的元素个数 |
c.max_size() | 返回元素个数之最大可能量 |
c.capacity() | 返回 “不进行空间重新分配” 条件下的元素最大容纳量 |
c.reserve(num) | 如果容量不足,扩大之 |
c.shrink_to_fit() | 要求降低容量,以符合元素个数(始自C++11) |
c1 == c2 | 返回 c1 是否等于 c2(对每个元素调用==) |
c1 != c2 | 返回 c1 是否不等于 c2(相当于!(c1==c2)) |
c1 < c2 | 返回 c1 是否小于 c2 |
c1 > c2 | 返回 c1 是否大于 c2(相当于 c2 < c1) |
c1 <= c2 | 返回 c1 是否小于等于 c2(相当于 !(c2<c1)) |
c1 >= c2 | 返回 c1 是否大于等于 c2(相当于 !(c1<c2)) |
#include <iostream>
#include <vector>
using namespace std;
int main(){
int a[7] = {1, 2, 3, 4, 5, 6, 7};
vector<int> c(a, a + 5);//复制[a, a + 5)之间的元素到vector
vector<int> c1(20);
c1[0] = 1;
vector<int> c2(a, a + 5);
vector<int> c3(a + 1, a + 6);
printf("c--vector是否为空:%d\n", c.empty());
printf("c--vector目前元素个数:%d\n", c.size());
printf("c1--vector目前元素个数:%d\n", c1.size());
printf("c--vector元素个数之最大可能量:%lld\n", c.max_size());
printf("c--vector不重新分配空间元素最大容纳量:%d\n", c.capacity());
c1.reserve(30);
printf("c1--vector不重新分配空间元素最大容纳量:%d 0号位上的元素:%d\n\n", c1.capacity(), c1[0]);
printf("c2 == c:%s\n", c2 == c ? "true" : "false");
printf("c3 != c:%s\n", c3 != c ? "true" : "false");
printf("c3 < c:%s\n", c3 < c ? "true" : "false");
printf("c3 > c:%s\n", c3 > c ? "true" : "false");
printf("c3 <= c:%s\n", c3 <= c ? "true" : "false");
printf("c3 >= c:%s\n", c3 >= c ? "true" : "false");
return 0;
}
vector 赋值
操作 | 描述 |
---|---|
c = c2 | 将 c2 的全部元素赋值给 c |
c = rv | 将 rvalue rv 的所有元素以 move assign 方式给予 c(始自C++11) |
c = initlist | 将初值列 initlist 的所有元素赋值给 c(始自C++11) |
c.assign(n, elem) | 复制 n 个 elem,赋值给 c |
c.assign(beg, end) | 将区间 [beg, end) 内的元素赋值给 c |
c.assign(initlist) | 将初值列 initlist 的所有元素赋值给 c |
c1.swap(c2) | 置换 c1 和 c2 的数据 |
swap(c1, c2) | 置换 c1 和 c2 的数据 |
#include <iostream>
#include <vector>
using namespace std;
int main(){
int a[7] = {1, 2, 3, 4, 5, 6, 7};
vector<int> c(a, a + 5);//复制[a, a + 5)之间的元素到vector
vector<int> c1(5);
vector<int> c2(5);
vector<int> c3(5);
c1 = c;
printf("c1赋值c中所有元素:");
for(int i = 0; i < c1.size(); i ++)
printf("%d ", c1[i]);
printf("\n");
c2.assign(5, 2);
printf("c2元素赋值为2:");
for(int i = 0; i < c2.size(); i ++)
printf("%d ", c2[i]);
printf("\n");
c3.assign(a+1, a+6);
printf("c3赋值[a+1, a+6)的元素:");
for(int i = 0; i < c3.size(); i ++)
printf("%d ", c3[i]);
printf("\n");
c1.swap(c2);
printf("c1与c2交换元素--c1:");
for(int i = 0; i < c1.size(); i ++)
printf("%d ", c1[i]);
printf("\n");
swap(c1, c2);
printf("c1与c2交换元素--c1:");
for(int i = 0; i < c1.size(); i ++)
printf("%d ", c1[i]);
printf("\n");
return 0;
}
vector 元素访问
操作 | 描述 |
---|---|
c[idx] | 返回索引 idx 所指的元素(不检查范围) |
c.at(idx) | 返回索引 idx 所指的元素(如果 idx 超出范围就抛出 range-error 异常) |
c.front() | 返回第一元素(不检查是否存在第一元素) |
c.back() | 返回最末元素(不检查是否存在最末元素) |
vector 安插和移除元素
操作 | 描述 |
---|---|
c.push_back(elem) | 附加一个 elem 的拷贝于末尾 |
c.pop_back() | 移除最后一个元素,但是不返回它 |
c.insert(pos, elem) | 在 iterator 位置 pos 之前方插入一个 elem 拷贝,并返回新元素的位置 |
c.insert(pos, n, elem) | 在 iterator 位置 pos 之前方插入 n 个 elem 拷贝,并返回第一个新元素的位置(或返回 pos———如果没有新元素的话) |
c.insert(pos, beg, end) | 在 iterator 位置 pos 之前方插入区间 [beg, end) 内所有元素的一份铂贝,并返回第一个新元素的位置(或返回pos——如果没有新元素的话) |
c.insert(pos, initlist) | 在 iterator 位置 pos 之前方插入初值列 initlist 内所有元素的一份拷贝,并返回第一个新元素的位置(或返回 pos——如果没有新元素的话;始自C++11) |
c,emplace(pos, args…) | 在 iterator 位置 pos 之前方插入一个以 args 为初值的元素,并返回新元素的位置(始自C++11) |
c.emplace_back(args…) | 附加一个以 args 为初值的元素于末尾,不返回任何东西(始自C++11) |
c.erase(pos) | 移除 iterator 位置 pos 上的元素,返回下一元素的位置 |
c.erase(beg, end) | 移除 [beg, end) 区间内的所有元素,返回下一元素的位置 |
c.resize(num) | 将元素数量改为 num(如果 size() 变大,多出来的新元素都需以 default 构造函数完成初始化) |
c.resize(num, elem) | 将元素数量改为 num(如果 size() 变大,多出来的新元素都是 elem 的拷贝) |
c.clear() | 移除所有元素,将容器清空 |
c.begin() | 返回一个 random-access iterator 指向第一元素 |
c.end() | 返回一个 random-access iterator 指向最末元素的下一位置 |
c.cbegin() | 返回一个 const random-access iterator 指向第一元素(始自C++11) |
c.cend() | 返回一个 const random-access iterator 指向最末元素的下一位置(始自C++11) |
c.rbegin() | 返回一个反向的 (reverse)iterator 指向反向迭代的第一元素 |
c.rend() | 返回一个反向的 (reverse) iterator 指向反向迭代的最末元素的下一位置 |
c.crbegin() | 返回一个 const reverse iterator 指向反向迭代的第一元素(始自C++11) |
c.crend() | 返回一个 const reverse iterator 指向反向迭代的最末元素的下一位置(始自C++11) |
#include <iostream>
#include <vector>
using namespace std;
int main(){
int a[8] = {1, 2, 3, 4, 5, 6, 7, 8};
vector<int> c(a, a + 5);//复制[a, a + 5)之间的元素到vector
vector<int> c1(5);
vector<int> c2(5);
vector<int> c3(5);
c.push_back(6);
printf("向c末尾加一个6:");
for(int i = 0; i < c.size(); i ++)
printf("%d ", c[i]);
printf("\n");
c.pop_back();
printf("移除c末尾的6:");
for(int i = 0; i < c.size(); i ++)
printf("%d ", c[i]);
printf("\n");
c.insert(c.end(), 6);
printf("c末尾插入6:");
for(int i = 0; i < c.size(); i ++)
printf("%d ", c[i]);
printf("\n");
c.insert(c.end(), 2, 7);
printf("c末尾插入两个7:");
for(int i = 0; i < c.size(); i ++)
printf("%d ", c[i]);
printf("\n");
c.insert(c.end(), a + 7, a + 8);
printf("c末尾插入一个8:");
for(int i = 0; i < c.size(); i ++)
printf("%d ", c[i]);
printf("\n");
c.erase(c.begin());
printf("c删除第一个元素:");
for(int i = 0; i < c.size(); i ++)
printf("%d ", c[i]);
printf("\n");
c.erase(c.begin(), c.end());
printf("c删除所有元素:");
for(int i = 0; i < c.size(); i ++)
printf("%d ", c[i]);
printf("\n");
c.resize(10);
printf("将c的大小改为10:%d\n", c.size());
c.resize(20, 10);
printf("c大小改为20,增加的赋值为20:");
for(int i = 0; i < c.size(); i ++)
printf("%d ", c[i]);
printf("\n");
c.clear();
printf("移除所有元素,容器清空:%d\n", c.size());
for(int i = 0; i < 5; i ++)
c.push_back(i + 1);
printf("\n\nbegin():%d\n", *c.begin());
printf("end():%d\n", *c.end());
printf("rbegin():%d\n", *c.rbegin());
printf("rend():%d\n", *c.rend());
return 0;
}
参考书籍 :C++标准库(第二版)——侯捷译