携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情
1.vector数据存取概述
功能描述:
- 对vector中的数据的存取操作
函数原型:
at(int idx);//返回索引idx所指的数据operator[];//返回索引idx所指的数据front();//返回容器中第一个数据元素back();//返回容器中最后一个数据元素
2.代码举例说明示例:
#include <vector>
void test01()
{
vector<int>h;
for (int i = 0; i < 10; i++)
{
h.push_back(i);
}
for (int i = 0; i < v1.size(); i++)
{
cout << h[i] << " ";
}
cout << endl;
for (int i = 0; i < h.size(); i++)
{
cout << h.at(i) << " ";
}
cout << endl;
cout << "h的第一个元素为: " << h.front() << endl;
cout << "h的最后一个元素为: " << h.back() << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:
- 除了用迭代器获取vector容器中元素,[ ]和at也可以
- front返回容器第一个元素
- back返回容器最后一个元素
3. vector互换容器概述
功能描述:
- 实现两个容器内元素进行互换
函数原型:
swap(vec);// 将vec与本身的元素互换
4.代码举例说明
#include <vector>
void printVector(vector<int>& h) {
for (vector<int>::iterator it = h.begin(); it != h.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector<int>h01;
for (int i = 0; i < 10; i++)
{
h01.push_back(i);
}
printVector(h01);
vector<int>h01;
for (int i = 10; i > 0; i--)
{
h02.push_back(i);
}
printVector(h02);
//互换容器
cout << "互换后" << endl;
h01.swap(h02);
printVector(h01);
printVector(h02);
}
void test02()
{
vector<int> h;
for (int i = 0; i < 100000; i++) {
h.push_back(i);
}
cout << "h的容量为:" << h.capacity() << endl;
cout << "h的大小为:" << h.size() << endl;
h.resize(3);
cout << "h的容量为:" << h.capacity() << endl;
cout << "h的大小为:" << h.size() << endl;
//收缩内存
vector<int>(h).swap(h); //匿名对象
cout << "h的容量为:" << h.capacity() << endl;
cout << "h的大小为:" << h.size() << endl;
}
int main() {
test01();
test02();
system("pause");
return 0;
}
结论: swap可以使两个容器互换,可以达到实用的收缩内存效果
5. vector预留空间概述
功能描述:
- 减少vector在动态扩展容量时的扩展次数
函数原型:
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。
6.代码举例说明
#include <vector>
void test01()
{
vector<int> h;
//预留空间
h.reserve(100000);
int num = 0;
int* p = NULL;
for (int i = 0; i < 100000; i++) {
h.push_back(i);
if (p != &h[0]) {
p = &h[0];
num++;
}
}
cout << "num:" << num << endl;
}
int main() {
test01();
system("pause");
return 0;
}
结论: 如果数据量较大,可以一开始利用reserve预留空间
7.vector与普通数组的区别:
-
数组是静态空间,而vector可以动态拓展。
-
数组静态空间:数组在声明时即指定了大小。无法再改变。
-
vector动态拓展:并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝到新空间中,释放原空间。
-
动态拓展机制:类似于C#种的ArrayList的Capacity拓展,当空间不足时,自动开辟。ArrayList会自动翻倍,但是vector不会翻倍,他会增加当前容量的一半。