您的位置:首页 > 编程语言 > C语言/C++

C++ 中vector的基本用法

2013-08-06 21:58 417 查看
//在网上看了好久,自己总结了一下下,第一篇博客,呼呼,学到不少

基本概念

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 ] ); //注意第二个指正要指到末尾元素的下一个元素

以下是事例:

#include<iostream>
#include <vector>
using namespace std;
int main(){
int a[ 6 ] = { -2, -1, 0, 1, 2, 1024 };
//拷贝数组中的元素
vector< int > vec1( a, a+6 );
cout<<vec1[0]<<' '<<vec1[1]<<' '<<vec1[2]<<' '<<vec1[3]<<endl;

//拷贝数组中的元素
//两个指针标记了对象的值的范围,第二个指针总是指向要拷贝的末元素的下一位置
vector< int > vec( &a[ 2 ], &a[5] );
cout<<vec[0]<<' '<<vec[1]<<' '<<vec[2]<<' '<<vec[3]<<endl;  //vec[3]输出错误,因为不存在

//把vec 拷贝到另一个容器中
vector< int > newone;
newone = vec;
cout<<newone[0]<<endl;
return 0;
}


常用方法

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() 返回指向容器最后一个元素的迭代器

使用迭代器

迭代器:迭代器是个所谓的智能指针,具有遍历复杂数据结构的能力,就看做是容器的专用指针吧,用容器时一般都要使用到这个,那种用数组索引的方法反而更加少用了,下面是一个简单的使用迭代器的示例:

//利用迭代器更改容器中的某一个值
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> abc;
abc.push_back(1);       //push几个值进去
abc.push_back(5);
abc.push_back(3);
abc.push_back(4);

//   迭代器遍历寻遍
for(vector<int>::iterator it = abc.begin();it!=abc.end();)
{
if(*it ==4)
it = abc.erase(it);
else
++it;
}
cout << "After remove 5:\n";
for(vector<int>::iterator i = abc.begin(); i < abc.end(); ++i)
{
cout << * i << " ";
}
cout << endl;
return 0;
}


以下是一些简单的程序:

定义一个二维数组

#include<iostream>
#include<vector>
using namespace std;
int main(){
int i = 0,j = 0;    //容器内部的容器
//Array  是10行,且都为0
vector< vector<int> > Array(10,vector<int>(0));

for(j = 0; j < 10; j++)
{
for (i = 0; i < 9; i++)
{
Array[j].push_back(i);
}
}
//输出
for( j = 0; j < 10; j++ )
{
for(i = 0; i<Array[j].size(); i++)
{
cout << Array[j][i] << " ";
}
cout<< endl;
}
}


排序与逆向

#include<iostream>
#include<vector>
#include<algorithm>
#include <cstdlib>
using namespace std;
int main(){
vector<int>  num;
int element;
while(cin>>element)
num.push_back(element);

sort(num.begin(),num.end());             //从大到小排序

reverse(num.begin(),num.end());          //逆向输出

for(int i = 0;i<num.size();i++)
cout<<num[i]<<endl;

system("pause");
return 0;
}


定义二维动态数组

#include<iostream>
#include<vector>
using namespace std;
int main(){
int i = 0,j = 0;
vector<vector<int> >  Array;
vector<int>  line;
for(j = 0;j < 20;j++){
Array.push_back(line);     //要对每一个vector初始化,初始化列。
for (i = 0; i < 9; i++ )
{
Array[ j ].push_back( i );
}
}

for(j = 0;j < 10;j++ )
{
for(i = 0; i<Array[j].size(); i++)
{
cout << Array[j][i] << " ";
}
cout<< endl;
}
}


参考:http://blog.csdn.net/xiaohuizi2009/article/details/8067667
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: