vector的用法
vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多
大时,用其来解决问题可以达到最大节约空间的目的.
用法:
1.文件包含:
首先在程序开头处加上#include<vector>以包含所需要的类文件vector
还有一定要加上using namespace std;
2.变量声明:
例:声明一个int向量以替代一维的数组:vector <int> a;
(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除)。
例:用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,
所以只要声明一个地址的向量即可,即:vector <int *> a.同理想用向量代替三维数组也是一样,vector <int**>a;
再往上面依此类推.
3.具体的用法以及函数调用:
如何得到向量中的元素?其用法和数组一样:
例如:
vector <int> a
int b = 5;
a.push_back(b);//该函数下面有详解
cout<<a[0]; //输出结果为5
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交换数据
4.备注:在用vector的过程中我碰到了一个问题,特此列出讨论:
1)
vector <int > a;
int b = 5;
a.push_back(b);
此时若对b另外赋值时不会影响a[0]的值
2)
vector <int*> a;
int *b;
b= new int[4];
b[0]=0;
b[1]=1;
b[2]=2;
a.push_back(b);
delete b; //释放b的地址空间
for(int i=0 ; i <3 ; i++)
{
cout<<a[0]<<endl;
}
此时输出的值并不是一开始b数组初始化的值,而是一些无法预计的值.
分析:根据1) 2)的结果,可以想到:
在1)中, 往a向量中压入的是b的值,即a[0]=b,此时a[0]和b是存储在两个不同的地址中的.因此改变b的值不会影响a[0];
而在2)中,因为是把一个地址(指针)压入向量a,即a[0]=b,因此释放了b的地址也就释放了a[0]的地址,因此a[0]数组中存放的数值
也就不得而知了.
/*****************************************************************************************/
/*对于一维vector的定义*/
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
int main(void)
{
int i = 0;
vector<int> v;
for( i = 0; i < 10; i++ )
{
v.push_back( i );//把元素一个一个存入到vector中
}
/* v.clear()*/ 对存入的数据清空
for( i = 0; i < v.size(); i++ )//v.size() 表示vector存入元素的个数
{
cout << v[ i ] << " "; //把每个元素显示出来
}
cont << endl;
return 0;
}
注:你也可以用v.begin()和v.end() 来得到vector开始的和结束的元素地址的指针位置。
你也可以这样做:
vector<int>::iterator iter; /*iterator 抽象了指针的绝大部分基本特征*/
for( iter = v.begin(); iter != v.end(); iter++ )
{
cout << *iter << endl;
}
/*****************************************************************************************/
/*对于二维vector的定义*/
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
int main(void)
{
int i = 0, j = 0;
//定义一个二维的动态数组,有10行,每一行是一个用一个vector存储这一行的数据。
//所以每一行的长度是可以变化的。之所以用到vector<int>(0)是对vector初始化,否则不能对vector存入元素。
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;
}
return 0;
}
/*****************************************************************************************/
/*定义一个行列都是变化的数组*/
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
int main(void)
{
int i = 0, j = 0;
vector< vector<int> > Array;
vector< int > line;
for( j = 0; j < 10; 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;
}
return 0;
}
/*****************************************************************************************/
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <list>
#include <algorithm> //to use remove_if
using namespace std;
typedef vector<int> V;
typedef vector<int>::iterator VIT;
typedef list<int> L;
typedef list<int>::iterator LIT;
V v;
L lis;
class InList
{
public:
InList(list<int> &lis):li(lis){}
bool operator()(int n)
{
return find(li.begin(), li.end(), n)!=li.end();
}
private:
list<int> &li;
};
/*****************************************************************************************/
int main()
{
int i;
for(i=0; i<10; ++i) // 初始化v: 0 1 2 3 4 5 6 7 8 9
v.push_back(i);
for(i=0; i<5; ++i) // 初始化lis:0 1 2 3 4
lis.push_back(i);
VIT it;
//cout<<endl<<v.end()-v.begin()<<endl; //vector容器的iterator是支持加减操作的,这在其他类型的迭代器中很
少见
#ifdef DEMO1
//遍历删除v中不等于3的元素的正确方法
for(it=v.begin(); it!=v.end();)
{
if(*it != 3)
{
//将it赋值为erase()的返回值,它指向the new location of the element that followed the last
element erased
it = v.erase(it);
}
else
++it;
}
for(it=v.begin(); it!=v.end(); ++it)
cout<<*it<<endl;
#endif
#ifdef DEMO2
//DEMO2的功能: 在v中,删除那些在v和在lis中同时存在的元素,不使用remove_if
it = v.begin();
VIT del = it;
for(; it!=v.end(); ++it)
{
if(find(lis.begin(),lis.end(),*it) == lis.end())
{
*del++ = *it;
}
}//此时,del指向A iterator pointing to the new end of the sequence,which now includes all the elements
which is not in lis.
//整个v变为 5 6 7 8 9 5 6 7 8 9,其中,del指向第二个5
v.erase(del, v.end());
for(it=v.begin(); it!=v.end(); ++it)
cout<<*it<<endl;
#endif
#ifdef DEMO3
//DEMO2的功能: 在v中,删除那些在v和在lis中同时存在的元素,使用remove_if
/*
//如果先单独运行remove_if,则v会变为5 6 7 8 9 5 6 7 8 9
//即其前五个值由0 1 2 3 4 变为5 6 7 8 9,这与remove_if的实现有关
remove_if(v.begin(), v.end(), InList(lis));
for(it=v.begin(); it!=v.end(); ++it)
cout<<*it<<endl;
*/
//remove_if的返回值是A forward iterator pointing to the new end of the sequence,
//which now includes all the elements for which InList(lis) was false.
v.erase(remove_if(v.begin(), v.end(), InList(lis)), v.end());
for(it=v.begin(); it!=v.end(); ++it) //此时v变为5 6 7 8 9, 0 1 2 3 4被删除
cout<<*it<<endl;
#endif
return 0;
}
/*****************************************************************************************/
#include <vector>
#include <iostream>
int main(void)
{
using namespace std;
vector<int> v;
v.push_back(6);
v.push_back(7);
v.push_back(8);
v.push_back(10);
for(int i = 0; i < v.size(); i++)
cout << "v[" << i << "] = " << v << endl;
cout<<endl<<endl;
v.insert(v.begin() + 3, 9); //在元素10的前面插入9
v.insert(v.begin(), 5); //插入5为首元素
v.insert(v.end(), 11); //插入11为末元素
cout<<endl<<endl;
for( i = 0; i < v.size(); i++)
cout << "v[" << i << "] = " << v << endl;
vector <int>::iterator iter,iend;
int j;
iend = v.end();
cout<<endl<<endl;
for(iter= v.begin(),j=0;iter!=iend;iter++,j++)
{
cout<<"v["<<j<<"]="<<*iter<<endl;
}
iter = v.begin();
v.erase(iter+2); //(1)
//v.erase(iter+2,iend); //(2)
cout<<endl<<endl;
for(iter= v.begin(),j=0;iter!=iend;iter++,j++)
{
cout<<"v["<<j<<"]="<<*iter<<endl;
}
cout<<endl<<endl;
for(/*int*/ i = 0; i < v.size(); i++)
{
cout << "v[" << i << "] = " << v << endl;
}
return 0;
}
(1)打印信息:
v[0] = 6
v[1] = 7
v[2] = 8
v[3] = 10
v[0] = 5
v[1] = 6
v[2] = 7
v[3] = 8
v[4] = 9
v[5] = 10
v[6] = 11
v[0]=5
v[1]=6
v[2]=7
v[3]=8
v[4]=9
v[5]=10
v[6]=11
v[0]=5
v[1]=6
v[2]=8
v[3]=9
v[4]=10
v[5]=11 //不知道为什么
v[6]=11
v[0] = 5
v[1] = 6
v[2] = 8
v[3] = 9
v[4] = 10
v[5] = 11
Press any key to continue
(2)打印信息
v[0] = 6
v[1] = 7
v[2] = 8
v[3] = 10
v[0] = 5
v[1] = 6
v[2] = 7
v[3] = 8
v[4] = 9
v[5] = 10
v[6] = 11
v[0]=5
v[1]=6
v[2]=7
v[3]=8
v[4]=9
v[5]=10
v[6]=11
v[0]=5
v[1]=6
v[2]=7
v[3]=8 //不知道为什么
v[4]=9
v[5]=10
v[6]=11
v[0] = 5
v[1] = 6
Press any key to continue
查资料才知道
资料:
http://topic.csdn.net/u/20080909/20/a3b94068-eb76-4963-8bf8-7c9bebe1f9e0.html
可能有不少人用Vector时,没太注意其iterator的用法,当Vector中的元素个数改变时,会引起iterator的一些error,看看下面
代码,体会一下,会令你豁然开朗的
void main()
{
vector<int> member;
member.push_back(1);
member.push_back(2);
member.push_back(2);
member.push_back(3);
member.push_back(1);
member.push_back(2);
member.push_back(4);
vector<int>::iterator iter;
for(iter = member.begin(); iter != member.end(); iter++)
cout<<*iter<<endl;
cout<<"do erase--------"<<endl;
for(iter = member.begin();
iter != member.end();iter++)
{
if(*iter == 2)
{
member.erase(iter);
}
}
for(iter = member.begin();
iter != member.end();iter++)
cout<<*iter<<endl;
}
咋一看,这不是和上面提到的第一种方法一样吗?貌似没有问题啊。可是,要注意到,调用erase后,回到for循环又继续使用迭
代器,并执行++运算。
好,让我们再温习一下erase函数的说明:
iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );
现在我们只关注函数执行后的副作用和返回值。函数调用后使指向position和first之后的所有迭代器失效。返回值则是一个指
向删除的最后一个元素后面的元素的迭代器。所以上面代码中的iter在调用erase后就无效了,我在VS2005中测试了,确实崩溃
在++的操作上。
要解决这个问题,我们只需弃用原来的迭代器,使用返回值即可,代码如下:
for(iter = member.begin(); iter != member.end();)
{
if(*iter == 2)
{
iter = member.erase(iter);
}
else
{
iter++;
}
}
1/**//*
2(C) C++ STL_study:http://hi.baidu.com/2008rightman
3
4Filename : VectorFindAndErase.cpp
5Compiler : Visual C++ 8.0
6Description : Demo how to erase iterator in a RIGHT way.
7Release : 11/14/2006
8*/
9#include <iostream>
10#include <vector>
11#include <algorithm>
12
13int main() {
14 const int iaSize = 11;
15 int ia[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89};
16
17 std::vector<int> ivec;
18 ivec.insert(ivec.end(), ia, ia + iaSize);
19
20 // Compile OK, but run-time error!!
21 // for(std::vector<int>::iterator iter = ivec.begin();
22 // iter != ivec.end(); ++iter) {
23 // if (*iter == 8) {
24 // ivec.erase(iter);
25 // }
26 // }
27
28 // This is a RIGHT way to do it.
29 std::vector<int>::iterator iter = find(ivec.begin(), ivec.end(), 8);
30 if (iter != ivec.end()) {
31 ivec.erase(iter);
32 }
33
34 // cout the result
35 for(std::vector<int>::const_iterator iter = ivec.begin();
36 iter != ivec.end(); ++iter) {
37
38 std::cout << *iter << std::endl;
39 }
40
41 return 0;
42}
/*****************************************************************************************/
文章评论(0条评论)
登录后参与讨论