C++ —— vector 容器
C++ —— vector 容器
- 引言
- vector容器的使用
- vector容器的嵌套
引言
string
只封装了字符数组
,而vector
容器支持任意类型的数组。
使用vector
容器需要包含头文件:#include <vector>
vector
类模板的声明:
template<class T, class Alloc = allocator<T>>
class vector{
private:
T *start_; // 动态数组的首地址
T *finish_; // 已使用空间的最后地址
T *end_; // 动态分配内存块最后的地址
……
}
第一个参数填数组的数据类型
,第二个模板参数指定分配器
,缺省用STL
提供的分配器。
在STL
中,容器和分配器是分开的。分配器是一个用于管理内存
的模板类。STL
提供的默认分配器叫allocator<T>
,用new
和delete
分配和释放内存。allocator<T>
分配器的原理很简单,就是从外面把容器的数据类型T
传给它,然后new
一个T
类型的数组就可以了。
vector容器的使用
直接看示例代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v; // 创建一个空的vector容器
cout << "v.capacity() = " << v.capacity() << endl; // v的容量 0
// 跟string不一样,vector容器容量缺省不会分配任何空间。
cout << "v.size() = " << v.size() << endl; // v的大小 0
vector<int> v2(8); // 创建一个元素个数为8的vector容器
cout << "v2.capacity() = " << v2.capacity() << endl; // v2的容量 8
cout << "v2.size() = " << v2.size() << endl; // v2的大小 8
vector<float> v3(4, 10.123); // 创建一个元素个数为4,每个元素值为10的vector容器
for(int i = 0; i < v3.size(); i++) {
cout << "v3[" << i << "] = " << v3[i] << endl;
}
// 使用统一初始化列表创建容器
vector<int> v4({1,436,4,7,8,1,43});
// vector<int> v4 = {1,436,4,7,8,1,43}; // 等同于上面的写法
for(int i = 0; i < v4.size(); i++) {
cout << "v4[" << i << "] = " << v4[i] << endl;
}
cout << "v4.front() = " << v4.front() << endl; // 返回第一个元素的值
cout << "v4.back() = " << v4.back() << endl; // 删除最后一个元素,并返回其值
v4.pop_back(); // 删除最后一个元素
v4.push_back(666); // 在容器尾部添加一个元素
cout << "v4.back() = " << v4.back() << endl; // 返回最后一个元素的值
cout << "v4[4] = " << v4[4] << endl; // 访问下标为4的元素的值
cout << "v4.at(5) = " << v4.at(5) << endl; // 访问下标为5的元素的值
v4.insert(v4.begin() + 2, 100); // 在下标为2的位置插入一个元素
for(int i = 0; i < v4.size(); i++) {
cout << "v4[" << i << "] = " << v4[i] << endl;
} // v4 = {1, 436, 100, 4, 7, 8, 1, 666}
cout << "v4.empty() = " << v4.empty() << endl; // 判断容器是否为空 v4.empty() = 0
cout << "v4.data() = " << v4.data() << endl; // 返回容器中动态数组的首的地址 v4.data() = 0x560103951f40
cout << "v4.data()[2] = " << v4.data()[2] << endl; // 访问下标为2的元素的值 100
cout << "*(v4.dtat() + 1) = " << *(v4.data() + 1) << endl; // 访问下标为1的元素的值 436
v4.assign(4, 111); // 将容器v4重新赋值为元素个数为4,每个元素值都为111的vector
for(int i : v4) {
cout << i << " ";
} // v4 = {111, 111, 111, 111}
cout << endl;
cout << "v4.size() = " << v4.size() << endl; // 输出容器v4的大小 4
v4.assign({11, 345, 4, 12, 6}); // 将容器v4重新赋值为{1, 2, 3, 4, 5, 6}
for(int i : v4) {
cout << i << " ";
} // v4 = {11, 345, 4, 12, 6}
cout << endl;
return 0;
}
vector
容器的本质是数组
,数组的内存空间
是连续
的。如果在中间插入(删除)元素,要把后面的元素全部往后(前)移动。移动元素的效率是很低的。所以,尽可能不要在vector
容器的中间插入和删除元素。
vector容器的嵌套
STL
的大部分容器可以相互嵌套,直接看如下代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>> vv; // 创建一个容器vv,元素的数据类型为vector<int>
vector<int> v; // 创建一个容器v,作为vv的元素
v = {1, 2, 3, 4}; // 初始化容器v
vv.push_back(v); // 将容器v添加到vv中
v = {134,56,7,76,7,8,7};
vv.push_back(v);
v = {123, 123, 123};
vv.push_back(v);
for(int i = 0; i <vv.size(); i++) {
for(int j = 0; j < vv[i].size(); j++) {
cout << vv[i][j] << " ";
}
cout << endl;
}
return 0;
}
运行效果如下:
1 2 3 4
134 56 7 76 7 8 7
123 123 123
感谢浏览,一起学习!