目录
vector容器
·单端数组
·与数组相似。数组是静态空间,容器是动态空间。
动态拓展:找到更大的空间,将原数据拷贝过去,释放原空间。
常用迭代器
**从前往后**
begin:容器的第一个元素位置
end:容器最后一个元素位置的后一个位置
**从后往前**
rbegin:容器的最后一个元素
rend:容器第一个元素的前一个位置
vector容器构造函数
1.无参构造
vector<int> v;//无参构造 int i = 0; while (i < 10) { v.push_back(i); i++; }
2.区间构造
vector<int> v2(v.begin(),v.end());//区间构造
3.n个元素构造
vector<int> v2(10,100);//区间构造,将10个100添加进容器中
4.拷贝构造函数
vector<int> v2(v);//拷贝构造,v见第一条
vector容器赋值操作
1.operator=
vector<int> v2; v2 = v;
2.assign方法
vector<int> v2; v2.assign(v.begin(), v.end());
3.n个元素赋值法
vector<int> v2; v2.assign(10,100);
vector容器容量和大小操作
(1)v.empty() 判断容器是否为空(空返回0,否则返回1)
(2)v.capacity() “容量”比“大小”大 扩容 大多少由算法决定
(3)v.resize(n) 设定容量大小。若重新指定比原来长,默认用0填充。短了,超出部分会被删除。
(4)v.resize(n,num) 设定容量大小。若重新指定比原来长,用num填充
vector插入与删除操作
1.尾部插入。尾部插入一个元素。(x对应容器的类型)
v.push_back(x);
2.尾部删除。删除最后一个元素。
v.pop_back();
3.insert插入。在第一个元素前插入一个元素
v.insert(v.begin(), x);//在第一个元素前插入一个x
v.insert(v.begin(),n, x);//在第一个元素前插入n个x
4.erase删除。
v.erase(v.begin(), v.end());//从头到尾所有元素全部删除
访问容器中的元素
初始化
vector<int> v; int i = 0; while (i < 10) { v.push_back(i); i++; }
1.[ ]方式
for (int i = 0; i < 10; i++) cout << " " << v[i];
2.at方法
for (int i = 0; i < 10; i++) cout << " " << v.at(i);
3.访问头部元素
cout << v.front();
4.访问尾部元素
cout << v.back();
两容器内元素互换
v1.swap(v);//v和v1是两个容器
实例:收缩内存
(1)一开始大小100,容量会开到130+。重新设定容器大小,设为10。此时容器大小为10,但容量仍为130+。
(2)若执行自我swap后,此时容器的大小为10,且容量也为10,节省了内存。
图1 未执行swap,容量仍是13
图2 执行了swap,容量变成5,与容器大小相同。
原理:
vector<int>(v) 匿名对象 容量5大小5
容器v 容量13大小10
容器v是个指针,swap后指向匿名对象所指的区域,所以容量5,大小5
预留空间
vector<int> v; int num = 0; int* p = NULL; for (int i = 0; i < 100; i++) { v.push_back(i); if (p != &v[0]) {//如果指针不是指向首地址,要么初始化未指定,要么拓展了空间 p = &v[0];//让它指向 num++;//拓展次数+1 } } cout << num;//统计拓展空间次数
运行结果:13
指拓展了13次空间
开辟空间语句
v.reserve(100);
一开始预留好了空间,就不用额外开辟。
一开始开了50的空间,则需要额外开辟3次。
待解决 传参
容量大小不是13吗?