备忘: 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;

 

posted @ 2014-12-22 21:23  isixther  阅读(144)  评论(0编辑  收藏  举报