C++向量

向量(Vectors

转自:http://blog.chinaunix.net/space.php?uid=14534760&do=blog&id=2800619

  1.基本操作
   vector是向量类型,她是一种对象实体,具有值,所以可以看作是变量。她可以容纳许多其他类型的相同实体,
如若干个整数,所以称其为容器。Vector是C++STL(标准模板类库)的重要一员,使用她时,只要包括头文件 #include即可。
   vector可以有四种定义方式:
vector<int>是模板形式,尖括号中为元素类型名,她可以是任何合法的数据类型。 
1)vector<int> a(10);
//定义了10个整数元素的向量,但并没有给出初值,因此其值是不确定的。

2)vector<int> b(10,1);
//定义了10个整数元素的向量,且给出每个元素的初值为1。这种形式是数组望尘莫及的,
//数组只能通过循环来成批的赋给相同初值。

3)vector<int> c(b);
//用另一个现成的向量来创建一个向量。

4)vector<int> d(b.begin(),b.begin()+3);
//定义了其值依次为b向量中第0到第2个(共3个)元素的向量。
 因此,创建向量时,不但可以整体向量复制性赋值,还可以选择其他容器的部分元素来定义向量和赋值。
特别的,向量还可以从数组获得初值。例如:
int a[8]={2007,9,24,2008,10,14,10,5};
vector<int> va(a,a+8);
上面第(4)种形式的b.begin() 、b.end()是表示向量的起始元素位置和最后一个元素之外的元素位置。
向量元素位置也属于一种类型,称为 遍历器。遍历器不单表示元素位置,还可以在容器中前后挪动。
每种容器都有对应的遍历器。向量中的遍历器类型为:
vector::iterator
因此要输入向量中所有元素,可以有两种循环控制方式:
for(int i=0; i//第一种方法
cout<" ";

for(vector<int>::iterator it=a.begin(); it!=a.end(); ++it) //第二种方法
cout<<*it<<" ";
第一种方法是下标方式, a[i]是向量元素操作,这种形式和数组一样;
第二种方法是遍历器方式, *it是指针间访形式,它的意义是 it所指向的元素值。
    a.size()是向量中元素的个数a.begin()表示向量的第一个元素,这种操作方式是一个对象捆绑一个函数调用,
表示对该对象进行某个操作。
   类似这样的使用方式称为调用对象a的成员函数,这在对象化程序设计中很普遍。
向量中的操作都是通过使用成员函数来完成的。它的常用操作有:

a.assign(b.begin(), b.begin()+3);            //b向量的0~2元素构成向量赋给a
a.assign(4,2);                                      //使a向量只含0~3元素,且赋值为2
int x=a.back();                                     //将a的最后一个向量元素值赋给整数型变量x
a.clear();                                             //a向量中元素清空(不再有元素)
if(a.empty()) cout<<"empty";                 //a.empty()经常作为条件,判断向量是否为空
int y=a.front();                                     //将a的第一个向量元素值赋给整型变量y
a.pop_back();                                       //删除a向量的最后一个元素
a.push_back(5);                                    //在a向量最后插入一个元素,其值为5
a.resize(10);                                         //将向量元素个数调至10个。多则删,少则补,其值随机
a.resize(10,2);                                      //将向量元素个数调至10个。多则删,少则补,其值为2
if(a=b) cout<<"epual";                           //向量的比较操作还有 !=, <, <=, >, >=
  除此之外,还有元素的插入与删除、保留元素个数、容量观察等操作。

 下面我们做一道习题,在一个名为data.txt的文档中,保存着如下数据

1 2 3 4 5 6 7 8
6 7 8 6 7 6 7 8

我们让其显示在dos界面上,代码如下:

 1 #include
2 #include
3 #include
4 using namespace std;
5 //-------------------------------
6 int main()
7 {
8 ifstream in("D:\\data.txt");//yuexingtian.txt文件必须要和此程序放在同一个文件夹下
9 vector<int> s;
10 int a;
11 //char b;//如果data.txt中有逗号存在,则该行不注释
12 int m=0;
13 while(in>>a)//将yuexingtian.txt的数据全都读入a中 
     //while(in>>a>>b)
14 {
15 s.push_back(a);//在s向量最后插入元素a的
16   }
17 int h=s.size();
18 for(int k=0;k19 {
20 cout<' ';
21 }
22 int pair=0;
23 for(int i=0;i1;++i)//比较是否有相等的数的for循环
24 for(int j=i+1;j25 if(s[i]==s[j])
26 {
27 pair++;
28 }
29 cout<30
31 }

二维向量的操作

参见博客:http://blog.chinaunix.net/space.php?uid=14534760&do=blog&id=2800624

用 STL vector 来创建二维数组
通常情况下,采用向量创建二维数组的方法有两种:
方法一:

1 int row=3;//行数
2 int column=4;//列数
3 vectorint
> >arry2(row);//定义一个三行四列的数组
4 for (int i=0;i< arry2.size( );i++)
5 {
6 arry2[i].resize(column);
7 }
方法二:
vectorint> >arry2(row,vector<int>(column));
但是由一个问题是怎样将二维数组中的元素一次性全部赋值给二维向量呢?
使用向量还是有很多好处的。例如:
(1)数组无法整体复制
int a[10] = {0};
int b[10] = a; //

vector<int> c(10);
vector<int> d = c; //正确
(2)向量有很多种的定义方式,还可以从数组中获得初值;
int a[3] = {1, 2, 3};
vector<int> va(a, a+3);
(3)数组无法做动态的规定,即使可以的话,还有很多后续的处理
int n;
cin>>n;
int a[n]; //不正确,数组大小不确定

若采用动态定做,从而需要释放空间

 

int n;
cin>>n;
int* ap = new int[n];
// 一系列数据处理
delete[] ap;

 

如果换成向量,则一目了然

int n;
cin>>n;
vector<int> va(n);

数组无法扩容

vectot<int> va;
//无法想象对应的数组操作
for (int a; cin>>a; va.push_bach(a));

向量还有好多常用的操作,这些操作是数组所不具备,但同时向量又可以像数组一样被使用,例如

 

vector<int> a;
a.push_bach(5); //在a向量最后位置插入一个元素
a.pop_back(); //删除a向量的最后一个元素
a.clear(); //清空a向量中的元素
int x = a.front(); //将a向量的第一个元素赋给x
int y = a.back(); //将a向量的最后一个元素赋给y
bool b = a.empty(); //判断是否为空
a.resize(10); //将元素个数调至10个,多则删,少则补
//等等

 

其中a.begin(),b.end()分别表示向量a的起始元素位置和最后一个元素之外的元素位置.

 

输出向量中的元素可以如下:

for (int i = 0; i < a.size(); ++i)
cout<" ";

此外,向量还可以排序:

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













你可能感兴趣的:(C++向量)