技术交流QQ群:1027579432,欢迎你的加入!
1.Cpp中的vector(可变长的动态数组)
- vector是顺序容器的一种。vector是可变长的动态数组,支持随机访问迭代器,所有STL算法都能对vector进行操作。要使用vector,需要包含头文件vector。在vector容器中,根据下标随机访问某个元素的时间是常数,在尾部添加一个元素的时间大多数情况下也是常数,总体来说速度很快。在中间插入或删除元素时,因为要移动多个元素,因此速度较慢,平均花费的时间和容器中的元素个数成正比。在vector容器中,用一个动态分配的数组来存放元素,因此根据下标访问某个元素的时间是固定的,与元素个数无关。
- vector容器在实现时,动态分配的存储空间一般都大于存放元素所需的空间。例如,哪怕容器中只有一个元素,也会分配32个元素的存储空间。这样做的好处是,在尾部添加一个新元素时不必重新分配空间,直接将新元素写入适当位置即可。在这种情况下,添加新元素的时间也是常数。但是,如果不断添加新元素,多出来的空间就会用完,此时再添加新元素,就不得不重新分配内存空间,把原有内容复制过去后再添加新的元素。碰到这种情况,添加新元素所花的时间就不是常数,而是和数组中的元素个数成正比。至于在中间插入或删除元素,必然涉及元素的移动,因此时间不是固定的,而是和元素个数有关。
2.vector有很多成员函数,常用的如表1所示:
vector中的常用成员函数.png
3.vector的基本用法如下:
```
#include "iostream"
#include "vector" // 使用vector需要包含此头文件
using namespace std;
// 函数模板
template <typename T>
void PrintVector(const vector<T> &v){
// 用于输出vector容器的全部元素的函数模板
typename vector<T>::const_iterator i; // typename用来说明 vector <T>::const_iterator是一个类型,在 Visual Studio 中不写也可以
for(i = v.begin(); i != v.end(); ++i)
cout << *i << " ";
cout << endl;
}
int main(){
int a[5] = {1, 2, 3, 4, 5};
vector<int> v(a, a+5); // 将数组a的内容放入v
cout << v.end() - v.begin() << endl; // 两个随机迭代器可以相减
PrintVector(v);
v.insert(v.begin()+2, 13); // 在 begin()+2 位置插人 13
PrintVector(v);
v.erase(v.begin()+2); // 删除位于 begin()+2 位置的元素
PrintVector(v);
vector<int> v2(4, 100); // v2有 4 个元素,都是 100
v2.insert(v2.begin(), v.begin()+1, v.begin()+3); // 将v的一段插入v2开头
PrintVector(v2);
v.erase(v.begin()+1, v.begin()+3); // 删除 v 上的一个区间,即 [2,3)
PrintVector(v);
return 0;
}
```
- vector还可以嵌套以形成可变长的二维数组,下面写法中int后面的两个>之间需要有空格,否则有的编译器会把它们当作>>运算符,编译会出错。例如:
// vector嵌套形成二维数组 vector<vector<int> > v3(3); // v3中有3个元素,每个元素都是vector<int>容器 for (int i = 0; i < v3.size(); ++i) { for (int j = 0; j < 4; ++j) v3[i].push_back(j); } for (int i = 0; i < v3.size(); ++i) { for (int j = 0; j < v3[i].size(); ++j) cout << "v3[" << i << "][" << j << "] = " << v3[i][j] << " "; cout << endl; }