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的大小 0vector<int> v2(8); // 创建一个元素个数为8的vector容器cout << "v2.capacity() = " << v2.capacity() << endl; // v2的容量 8cout << "v2.size() = " << v2.size() << endl; // v2的大小 8vector<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() = 0cout << "v4.data() = " << v4.data() << endl; // 返回容器中动态数组的首的地址 v4.data() = 0x560103951f40cout << "v4.data()[2] = " << v4.data()[2] << endl; // 访问下标为2的元素的值 100cout << "*(v4.dtat() + 1) = " << *(v4.data() + 1) << endl; // 访问下标为1的元素的值 436v4.assign(4, 111); // 将容器v4重新赋值为元素个数为4,每个元素值都为111的vectorfor(int i : v4) {cout << i << " ";} // v4 = {111, 111, 111, 111}cout << endl;cout << "v4.size() = " << v4.size() << endl; // 输出容器v4的大小 4v4.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}; // 初始化容器vvv.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
感谢浏览,一起学习!