备忘: C++中的 vector 容器
在C++ 中使用 vector:容器或叫向量。对用来管理不定长度的数据集或经常变化的数据组,很方便。可以简单的理解他是一种数据组,一种数据类型的集合。
vector是同一种类型的对象的集合。它相当于一个动态的数组, 当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的。
使用vector首先要在程序开头处加上头文件,并使用其命名 :
#include <vector>
using std::vector;
vector的声明与初始化:
vector <类型> <名称>
vector<int> IntVector;
vector<T> v1; |
vector保存类型为T的对象。默认构造函数v1为空。 |
vector<T> v2(v1); |
v2是v1的一个副本。 |
vector<T> v3(n, i); |
v3包含n个值为i的元素。 |
vector<T> v4(n); |
v4含有值初始化的元素的n个副本。 |
vector的操作:
v.empty() |
如果v为空,则返回true,否则返回false。 |
v.size() |
返回v中元素的个数。 |
v.push_back(t) |
在v的末尾增加一个值为t的元素。 |
v[n] |
返回v中位置为n的元素。 |
v1 = v2 |
把v1的元素替换为v2中元素的副本。 |
v1 == v2 |
如果v1与v2相等,则返回true。 |
!=, <, <=, >, >= |
保持这些操作符惯有的含义。 |
常用函数:
1.push_back 在数组的最后添加一个数据
2.pop_back 去掉数组的最后一个数据
3.at 得到编号位置的数据
4.begin 得到数组头的指针
5.end 得到数组的最后一个单元+1的指针
6.front 得到数组头的引用
7.back 得到数组的最后一个单元的引用
8.max_size 得到vector最大可以是多大
9.capacity 当前vector分配的大小
10.size 当前使用数据的大小
11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve 改变当前vecotr所分配空间的大小
13.erase 删除指针指向的数据项
14.clear 清空当前的vector
15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty 判断vector是否为空
18.swap 与另一个vector交换数据
19. insert 插入一条数据
vector的使用方法
1.数组习惯用法
可以像使用数组一样使用vector
可以通过ivec[索引号] 来访问元素
int n[10] vector< int > ivec( 10 ); // 类似数组定义int ia[ 10 ]; vector< int > ivec2( 10, 0 ); // 设置初始值为 0 ivec[0] = n[0]; //符值 for (int i=0; i<10; i++) cout << ivec[i] << endl;
2.STL使用法
通过迭代器iterator来访问与操作元素。 迭代器iterator是标准库中的类,它具有指针的功能。
通过迭代器来访问使用vector,更方便,更灵活。
迭代器声明方法:
vector <类型> :: iterator <名称>
vector<int>:: iterator myIterator;
例:
vector<string> svec(10, "null"); vector<string>::iterator n; n = svec.begin(); // 取初始对象 n = svec.begin() + 2; //移动到指定的对象 *n = "TEXT"; //符值 // 下在的语句重新定义了一个迭代器 i, 并遍历 i 的值。 for (vector<string>::iterator i = svec.begin(); i != svec.end(); i++){ cout << *i << endl; }
也可以先定义一个空的 vector 用 push_back, insert, resize等来添加或指定大小。像使用动态数组一样使用他。
用迭代器作为指针的一种使用方式:
vector<int *> svec(10); vector<int *>::iterator n; int N[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int *p; int m = 0; for (vector<int *>::iterator i = svec.begin(); i != svec.end(); i++){ p = &N[m]; //把指针符给p *i = p; //再把指针给 i 或 *i=&N[m] m++; cout << *i << '=' << *p << '/' << **i << endl; } n = svec.begin() + 2; // 取第三个迭代器 0-1-2 **n = 100; // 给迭代器所指向的数据符值。相当于 N[2]=100; // 注意:*n 是保存的地址,**n才是指向N[2]的数据值空间 for (m = 0; m < 10;m++) cout << m << '=' << N[m] << endl;