C++ vector,STL vector(可变长的动态数组)详解
在 vector 容器中,根据下标随机访问某个元素的时间是常数,在尾部添加一个元素的时间大多数情况下也是常数,总体来说速度很快。
在中间插入或删除元素时,因为要移动多个元素,因此速度较慢,平均花费的时间和容器中的元素个数成正比。
在 vector 容器中,用一个动态分配的数组来存放元素,因此根据下标访问某个元素的时间是固定的,与元素个数无关。
vector 容器在实现时,动态分配的存储空间一般都大于存放元素所需的空间。例如,哪怕容器中只有一个元素,也会分配 32 个元素的存储空间。这样做的好处是,在尾部添加一个新元素时不必重新分配空间,直接将新元素写入适当位置即可。在这种情况下,添加新元素的时间也是常数。
但是,如果不断添加新元素,多出来的空间就会用完,此时再添加新元素,就不得不重新分配内存空间,把原有内容复制过去后再添加新的元素。碰到这种情况,添加新元素所花的时间就不是常数,而是和数组中的元素个数成正比。
至于在中间插入或删除元素,必然涉及元素的移动,因此时间不是固定的,而是和元素个数有关。
vector 有很多成员函数,常用的如表 1 所示。
first 和 last 可以是其他容器的迭代器。一般来说,本构造函数初始化的结果就是将 vector 容器的内容变成与其他容器上的区间 [first, last) 致
#include vector //使用vector需要包含此头文件 using namespace std; template class 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 1) v.end() - v.begin() endl; //两个随机迭代器可以相减,输出:1)5 cout 2) PrintVector(v); //输出:2)1 2 3 4 5 v.insert(v.begin() + 2, 13); //在 begin()+2 位置插人 13 cout 3) PrintVector(v); //输出:3)1 2 13 3 4 5 v.erase(v.begin() + 2); //删除位于 begin()+2 位置的元素 cout 4) PrintVector(v); //输出:4)1 2 3 4 5 vector int v2(4, 100); //v2 有 4 个元素,都是 100 v2.insert(v2.begin(), v.begin() + 1, v.begin() + 3); //将v的一段插入v2开头 cout 5)v2: PrintVector(v2); //输出:5)v2:2 3 100 100 100 100 v.erase(v.begin() + 1, v.begin() + 3); //删除 v 上的一个区间,即 [2,3) cout 6) PrintVector(v); //输出:6)1 4 5 return 0; }
思考题:程序中的 PrintVector 模板演示了将容器的引用作为函数参数的用法。就完成输出整个容器内容这个功能来说,写成 PrintVector 模板这样是比较笨拙的,该模板的适用范围太窄。有没有更好的写法?
vector 还可以嵌套以形成可变长的二维数组。例如:
#include iostream #include vector using namespace std; int main() vector vector int v(3); //v有3个元素,每个元素都是vector int 容器 for(int i = 0;i v.size(); ++i) for(int j = 0; j ++j) v[i].push_back(j); for(int i = 0;i v.size(); ++i) { for(int j = 0; j v[i].size(); ++j) cout v[i][j] cout endl; return 0; }
程序的输出结果是:
0 1 2 3
0 1 2 3
0 1 2 3
vector vector int v(3);定义了一个 vector 容器,该容器中的每个元素都是一个 vector int 容器。即可以认为,v 是一个二维数组,一共 3 行,每行都是一个可变长的一维数组。
在 Dev C++ 中,上面写法中 int 后面的两个 之间需要有空格,否则有的编译器会把它们当作 运算符,编译会出错。
21147.html
chtmlSTL相关文章
- C++学习——c++逗号操作符说明(附加全部运算符优先级)
- C/C++数组初始化的一些误区
- C++二维数组sort排序问题
- 【c++的一些常用数组函数】
- 深入理解C++11_c++ string char
- C++基本概念_c语言 c++区别
- C++ 不知图系列之基于链接表的无向图最短路径搜索
- c++的链表-链表入门(C++)
- C/C++ Qt StandardItemModel 数据模型应用
- C/C++生态工具链——gcc/g++编译器使用指南
- 【C++修炼之路】2. 类和对象(上)
- 【C++】STL 模拟实现之 list
- 【开发环境】Ubuntu 中使用 VSCode 开发 C/C++ ⑤ ( tasks.json 中的 args 数组配置分析 | 编译并执行 C++ 程序 )
- c++ new string数组问题详解程序员
- C++实现可变长度的动态数组
- C++用类模板实现可变长数组
- C++对象数组(详解版)
- c++构造函数的初始化列表
- C#的锯齿数组以及C++实现代码
- C++用指针变量作为函数的参数接受数组的值的问题详细总结
- c++拷贝构造函数防篡改示例
- C++动态数组类的封装实例