//在网上看了好久,自己总结了一下下,第一篇博客,呼呼,学到不少
基本概念
vector容器是一个模板类,可以存放任何类型的对象)。vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的。
1、定义和初始化
* vector< 类型名 > 标识符 (n) //定义容器大小为n
* vector< 类型名 > 标识符(最大容量,初始所有值);
eg: vector< int > ivec( 10, -1 ); 定义了 ivec 它包含十个int型的元素 每个元素都被初始化为-1
* vector<类型名> vector<typeName>v2(v1); 或v2=v1;或vector<typeName> v2(v1.begin(), v1.end());
//v2是v1的一个副本,若v1.size()>v2.size()则赋值后v2.size()被扩充为v1.size()。
* 拷贝数组中的元素:int a[ 6 ] = { -2, -1, 0, 1, 2, 1024 };
// 把 ia 的 6 个元素拷贝到 ivec 中 vector< int > ivec( a, a+6 );
// 拷贝 3 个元素 a[2], a[3], a[4] vector< int > ivec( &a[ 2 ], &a[ 5 ] ); //注意第二个指正要指到末尾元素的下一个元素
以下是事例:
1 #include<iostream> 2 #include <vector> 3 using namespace std; 4 int main(){ 5 int a[ 6 ] = { -2, -1, 0, 1, 2, 1024 }; 6 //拷贝数组中的元素 7 vector< int > vec1( a, a+6 ); 8 cout<<vec1[0]<<' '<<vec1[1]<<' '<<vec1[2]<<' '<<vec1[3]<<endl; 9 10 //拷贝数组中的元素 11 //两个指针标记了对象的值的范围,第二个指针总是指向要拷贝的末元素的下一位置 12 vector< int > vec( &a[ 2 ], &a[5] ); 13 cout<<vec[0]<<' '<<vec[1]<<' '<<vec[2]<<' '<<vec[3]<<endl; //vec[3]输出错误,因为不存在 14 15 //把vec 拷贝到另一个容器中 16 vector< int > newone; 17 newone = vec; 18 cout<<newone[0]<<endl; 19 return 0; 20 }
常用方法
c.clear() 移除容器中所有数据。
c.empty() 判断容器是否为空。
c.erase(pos) 删除pos位置的数据
c.erase(beg,end) 删除[beg,end)区间的数据
c.front() 传回第一个数据。
c.insert(pos,elem) 在pos位置插入一个elem拷贝
c.pop_back() 删除最后一个数据。
c.push_back(elem) 在尾部加入一个数据。
c.resize(num) 重新设置该容器的大小
c.size() 返回容器中实际数据的个数。
c.begin() 返回指向容器第一个元素的迭代器
c.end() 返回指向容器最后一个元素的迭代器
使用迭代器
迭代器:迭代器是个所谓的智能指针,具有遍历复杂数据结构的能力,就看做是容器的专用指针吧,用容器时一般都要使用到这个,那种用数组索引的方法反而更加少用了,下面是一个简单的使用迭代器的示例:
1 //利用迭代器更改容器中的某一个值 2 #include<iostream> 3 #include<vector> 4 using namespace std; 5 int main(){ 6 vector<int> abc; 7 abc.push_back(1); //push几个值进去 8 abc.push_back(5); 9 abc.push_back(3); 10 abc.push_back(4); 11 12 // 迭代器遍历寻遍 13 for(vector<int>::iterator it = abc.begin();it!=abc.end();) 14 { 15 if(*it ==4) 16 it = abc.erase(it); 17 else 18 ++it; 19 } 20 cout << "After remove 5: "; 21 for(vector<int>::iterator i = abc.begin(); i < abc.end(); ++i) 22 { 23 cout << * i << " "; 24 } 25 cout << endl; 26 return 0; 27 }
以下是一些简单的程序:
定义一个二维数组
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int main(){ 5 int i = 0,j = 0; //容器内部的容器 6 //Array 是10行,且都为0 7 vector< vector<int> > Array(10,vector<int>(0)); 8 9 for(j = 0; j < 10; j++) 10 { 11 for (i = 0; i < 9; i++) 12 { 13 Array[j].push_back(i); 14 } 15 } 16 //输出 17 for( j = 0; j < 10; j++ ) 18 { 19 for(i = 0; i<Array[j].size(); i++) 20 { 21 cout << Array[j][i] << " "; 22 } 23 cout<< endl; 24 } 25 }
排序与逆向
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 #include <cstdlib> 5 using namespace std; 6 int main(){ 7 vector<int> num; 8 int element; 9 while(cin>>element) 10 num.push_back(element); 11 12 sort(num.begin(),num.end()); //从大到小排序 13 14 reverse(num.begin(),num.end()); //逆向输出 15 16 for(int i = 0;i<num.size();i++) 17 cout<<num[i]<<endl; 18 19 system("pause"); 20 return 0; 21 }
定义二维动态数组
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int main(){ 5 int i = 0,j = 0; 6 vector<vector<int> > Array; 7 vector<int> line; 8 for(j = 0;j < 20;j++){ 9 Array.push_back(line); //要对每一个vector初始化,初始化列。 10 for (i = 0; i < 9; i++ ) 11 { 12 Array[ j ].push_back( i ); 13 } 14 } 15 16 for(j = 0;j < 10;j++ ) 17 { 18 for(i = 0; i<Array[j].size(); i++) 19 { 20 cout << Array[j][i] << " "; 21 } 22 cout<< endl; 23 } 24 }
参考:http://blog.csdn.net/xiaohuizi2009/article/details/8067667