现在的位置: 首页 > 综合 > 正文

vector

2013年10月10日 ⁄ 综合 ⁄ 共 13989字 ⁄ 字号 评论关闭

1.vector 的数据的存入和输出:

 

#include<stdio.h>

#include<vector>

#include <iostream>

 

using namespace std;

 

void main()

 

{

 

   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;

 

 

注:你也可以用v.begin()和v.end() 来得到vector开始的和结束的元素地址的指针位置。你也可以这样做:

 

vector<int>::iterator iter; /*iterator 抽象了指针的绝大部分基本特征*/

 

for( iter = v.begin(); iter != v.end(); iter++ )

 

{

    cout << *iter << endl;

}

 

2. 对于二维vector的定义。

 

1)定义一个10个vector元素,并对每个vector符值1-10。

 

#include<stdio.h>

#include<vector>

#include <iostream>

 

using namespace std;

 

void main()

{

 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;

 }

}

 

2)定义一个行列都是变化的数组。

 

#include<stdio.h>

#include<vector>

#include <iostream>

 

using namespace std;

 

void main()

{

 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;

 }

}

 

 

 

 

 

 

 

 

 

 

使用 vettor erase 指定元素

 

#include "iostream"

#include "vector"

 

using namespace std;

 

int   main()

{

    vector<int>   arr;

    arr.push_back(6);

    arr.push_back(8);

    arr.push_back(3);

    arr.push_back(8);

 

    for(vector<int>::iterator it=arr.begin(); it!=arr.end(); )

    {

        if(* it == 8)

        {

            it = arr.erase(it);

        }

        else

        {

            ++it;

        }

    }

 

    cout << "After remove 8:/n";

 

    for(vector<int>::iterator it = arr.begin(); it < arr.end(); ++it)

    {

        cout << * it << " ";

    }

    cout << endl;

 

}

 

 

 

 vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

  为了可以使用vector,必须在你的头文件中包含下面的代码:

  #include <vector>

  vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:

  using std::vector;

  vector<int> vInts;

  或者连在一起,使用全名:

  std::vector<int> vInts;

  建议在代码量不大,并且使用的命名空间不多的情况下,使用全局的命名域方式:using namespace std;

  函数

  表述

  c.assign(beg,end) c.assign(n,elem)

  将(beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。

  c.at(idx)

  传回索引idx所指的数据,如果idx越界,抛出out_of_range。

  c.back()

  传回最后一个数据,不检查这个数据是否存在。

  c.begin()

  传回迭代器中的第一个数据地址。

  c.capacity()

  返回容器中数据个数。

  c.clear()

  移除容器中所有数据。

  c.empty()

  判断容器是否为空。

  c.end() //指向迭代器中末端元素的下一个,指向一个不存在元素。

  c.erase(pos) // 删除pos位置的数据,传回下一个数据的位置。

  c.erase(beg,end)

  删除[beg,end)区间的数据,传回下一个数据的位置。

  c.front()

  传回第一个数据。

  get_allocator

  使用构造函数返回一个拷贝。

  c.insert(pos,elem) //在pos位置插入一个elem拷贝,传回新数据位置

  c.insert(pos,n,elem) //在pos位置插入n个elem数据,无返回值

  c.insert(pos,beg,end) //在pos位置插入在[beg,end)区间的数据。无返回值

  c.max_size()

  返回容器中最大数据的数量。

  c.pop_back()

  删除最后一个数据。

  c.push_back(elem)

  在尾部加入一个数据。

  c.rbegin()

  传回一个逆向队列的第一个数据。

  c.rend()

  传回一个逆向队列的最后一个数据的下一个位置。

  c.resize(num)

  重新指定队列的长度。

  c.reserve()

  保留适当的容量。

  c.size()

  返回容器中实际数据的个数。

  c1.swap(c2)//将c1和c2元素互换

  swap(c1,c2)//同上操作。

  vector<Elem> //创建一个空的vector

  vector<Elem> c1(c2) //复制一个vector

  vector <Elem> c(n)//创建一个vector,含有n个数据,数据均已缺省构造产生

  vector <Elem> c(n, elem)//创建一个含有n个elem拷贝的vector

  vector <Elem> c(beg,end)//创建一个以(beg;end)为区间的vector

  c.~ vector <Elem>()//销毁所有数据,释放内存

  operator[]

  返回容器中指定位置的一个引用。

  创建一个vector

  vector容器提供了多种创建方法,下面介绍几种常用的。

  创建一个Widget类型的空的vector对象:

  vector<Widget> vWidgets;

  创建一个包含500个Widget类型数据的vector:

  vector<Widget> vWidgets(500);

  创建一个包含500个Widget类型数据的vector,并且都初始化为0:

  vector<Widget> vWidgets(500, Widget(0));

  创建一个Widget的拷贝:

  vector<Widget> vWidgetsFromAnother(vWidgets);

  向vector添加一个数据

  vector添加数据的缺省方法是push_back()。push_back()函数表示将数据添加到vector的尾部,并按需要来分配内存。例如:向vector<Widget>中添加10个数据,需要如下编写代码:

  for(int i= 0;i<10; i++) {

  vWidgets.push_back(Widget(i));

  }

  获取vector中指定位置的数据

  vector里面的数据是动态分配的,使用push_back()的一系列分配空间常常决定于文件或一些数据源。如果想知道vector是否为空,可以使用empty(),空返回true,否则返回false。获取vector的大小,可以使用size()。例如,如果想获取一个vector v的大小,但不知道它是否为空,或者已经包含了数据,如果为空时想设置为 -1,你可以使用下面的代码实现:

  int nSize = v.empty() ? -1 : static_cast<int>(v.size());

  访问vector中的数据

  使用两种方法来访问vector。

  1、 vector::at()

  2、 vector::operator[]

  operator[]主要是为了与C语言进行兼容。它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下:

  分析下面的代码:

  vector<int> v;

  v.reserve(10);

  for(int i=0; i<7; i++) {

  v.push_back(i); //在V的尾部加入7个数据

  }

  try {int iVal1 = v[7];

  // not bounds checked - will not throw

  int iVal2 = v.at(7);

  // bounds checked - will throw if out of range

  }

  catch(const exception& e) {

  cout << e.what();

  }

  删除vector中的数据

  vector能够非常容易地添加数据,也能很方便地取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据,当删除数据时,应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据。

  remove()算法 如果要使用remove,需要在头文件中包含如下代码:

  #include <algorithm>

  remove有三个参数:

  1、 iterator _First:指向第一个数据的迭代指针。

  2、 iterator _Last:指向最后一个数据的迭代指针。

  3、 predicate _Pred:一个可以对迭代操作的条件函数。

  条件函数

  条件函数是一个按照用户定义的条件返回是或否的结果,是最基本的函数指针,或是一个函数对象。这个函数对象需要支持所有的函数调用操作,重载operator()()操作。remove是通过unary_function继承下来的,允许传递数据作为条件。

  例如,假如想从一个vector<CString>中删除匹配的数据,如果字串中包含了一个值,从这个值开始,从这个值结束。首先应该建立一个数据结构来包含这些数据,类似代码如下:

  #include <functional>

  enum findmodes {

  FM_INVALID = 0,

  FM_IS,

  FM_STARTSWITH,

  FM_ENDSWITH,

  FM_CONTAINS

  };

  typedef struct tagFindStr {

  UINT iMode;

  CString szMatchStr;

  } FindStr;

  typedef FindStr* LPFINDSTR;

  然后处理条件判断:

  class FindMatchingString : public std::unary_function<CString, bool> {

  public:

  FindMatchingString(const LPFINDSTR lpFS) :

  m_lpFS(lpFS) {

  }

  bool operator()(CString& szStringToCompare) const {

  bool retVal = false;

  switch (m_lpFS->iMode) {

  case FM_IS: {

  retVal = (szStringToCompare == m_lpFDD->szMatchStr);

  break;

  }

  case FM_STARTSWITH: {

  retVal = (szStringToCompare.Left(m_lpFDD->szMatchStr.GetLength())

  == m_lpFDD->szWindowTitle);

  break;

  }

  case FM_ENDSWITH: {

  retVal = (szStringToCompare.Right(m_lpFDD->szMatchStr.GetLength())

  == m_lpFDD->szMatchStr);

  break;

  }

  case FM_CONTAINS: {

  retVal = (szStringToCompare.Find(m_lpFDD->szMatchStr) != -1);

  break;

  }

  }

  return retVal;

  }

  private:

  LPFINDSTR m_lpFS;

  };

  通过这个操作你可以从vector中有效地删除数据:

  FindStr fs;

  fs.iMode = FM_CONTAINS;

  fs.szMatchStr = szRemove;

  vs.erase(std::remove_if(vs.begin(), vs.end(), FindMatchingString(&fs)), vs.end());

  Remove(),remove等所有的移出操作都是建立在一个迭代范围上的,不能操作容器中的数据。所以在使用remove,实际上操作的时容器里数据的上面的。

  看到remove实际上是根据条件对迭代地址进行了修改,在数据的后面存在一些残余的数据,那些需要删除的数据。剩下的数据的位置可能不是原来的数据,但他们是不知道的。

  调用erase()来删除那些残余的数据。注意上面例子中通过erase()删除remove的结果和vs.enc()范围的数据。

 

 

 

Vector用于存储对象数组

 

常用方法

 

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交换数据

 

 

#include <iostream>

#include <algorithm>

#include <functional>

#include <vector>

using namespace std;

 

void main()

{

int iarray[]={0,1,2,3,4,5,6,6,6,7,8};

vector<int> ivector(iarray,iarray+sizeof(iarray)/sizeof(int));

int iarray1[]={6,6};

vector<int> ivector1(iarray1,iarray1+sizeof(iarray1)/sizeof(int));   

int iarray2[]={5,6};

vector<int> ivector2(iarray2,iarray2+sizeof(iarray2)/sizeof(int));

int iarray3[]={0,1,2,3,4,5,7,7,7,9,7};

vector<int> ivector3(iarray3,iarray3+sizeof(iarray3)/sizeof(int));

 

//找出ivector之中相邻元素值相等的第一个元素

cout<<*adjacent_find(ivector.begin(),ivector.end())<<endl;

 

//找出ivector之中元素值为6的元素个数

cout<<count(ivector.begin(),ivector.end(),6)<<endl;

 

//找出ivector之中小于7的元素个数

cout<<count_if(ivector.begin(),ivector.end(),bind2nd(less<int>(),7))<<endl;

 

//找出ivector之中元素值为4的第一个元素所在位置的元素

cout<<*find(ivector.begin(),ivector.end(),4)<<endl;

 

//找出ivector之中大于2的第一个元素所在位置的元素

cout<<*find_if(ivector.begin(),ivector.end(),bind2nd(greater<int>(),2))

<<endl; 

 

//找出ivector之中子序列ivector1所出现的最后一个位置,再往后3个位置的元素

cout<<*(find_end(ivector.begin(),ivector.end(),ivector1.begin(),

ivector1.end())+3)<<endl;

 

//找出ivector之中子序列ivector1所出现的第一个位置,再往后3个位置的元素

cout<<*(find_first_of(ivector.begin(),ivector.end(),ivector1.begin(),

ivector1.end())+3)<<endl; 

 

//子序列ivector2在ivector中出现的起点位置元素

cout<<*search(ivector.begin(),ivector.end(),ivector2.begin(),ivector2.end())

<<endl;

 

//查找连续出现3个6的起点位置元素

cout<<*search_n(ivector.begin(),ivector.end(),3,6,equal_to<int>())<<endl;

 

//判断两个区间ivector和ivector3相等否(0为假,1为真)

cout << equal(ivector.begin(), ivector.end(), ivector3.begin()) << endl;

 

//查找区间ivector3在ivector中不匹配点的位置

pair<int*,int*>result=mismatch(ivector.begin(),ivector.end(),ivector3.begin());

cout<< result.first - ivector.begin() << endl; 

}

 

#include <iostream>

#include <algorithm>

#include <functional>

#include <vector>

using namespace std;

 

class even_by_two{             //类定义形式的函数对象

public:

int operator()() const

{return _x+=2;}

private:

static int _x;

};

int even_by_two::_x=0;       //静态数据成员初始化

 

void main()

{

int iarray[]={0,1,2,3,4,5,6,6,6,7,8};

int iarray1[]={0,1,2,3,4,4,5,5,6,6,6,6,6,7,8};

vector<int> ivector(iarray,iarray+sizeof(iarray)/sizeof(int));

vector<int> ivector1(iarray+6,iarray+8);   

vector<int> ivector2(iarray1,iarray1+sizeof(iarray1)/sizeof(int));

ostream_iterator< int > output( cout, " " ); //定义流迭代器用于输出数据

 

//迭代遍历ivector1区间,对每一个元素进行even_by_two操作

    generate(ivector1.begin(),ivector1.end(),even_by_two());

copy(ivector1.begin(),ivector1.end(),output);

cout<<endl;

 

//迭代遍历ivector的指定区间(起点和长度),对每一个元素进行even_by_two操作

    generate_n(ivector.begin(),3,even_by_two());

copy(ivector.begin(),ivector.end(),output);

cout<<endl;

 

//删除元素6 

    remove(ivector.begin(),ivector.end(),6);

copy(ivector.begin(),ivector.end(),output);

cout<<endl; 

 

//删除(实际并未从原序列中删除)元素6,结果置于另一个区间

    vector<int> ivector3(12);

remove_copy(ivector.begin(),ivector.end(),ivector3.begin(),6);

copy(ivector3.begin(),ivector3.end(),output);

cout<<endl;

 

//删除(实际并未从原序列中删除)小于6的元素

remove_if(ivector.begin(),ivector.end(),bind2nd(less<int>(),6));

copy(ivector.begin(),ivector.end(),output);

cout<<endl; 

 

//删除(实际并未从原序列中删除)小于7的元素,结果置于另一个区间,

remove_copy_if(ivector.begin(),ivector.end(),ivector3.begin(),

bind2nd(less<int>(),7));

copy(ivector3.begin(),ivector3.end(),output);

cout<<endl; 

 

//将所有的元素值6,改为元素值3

replace(ivector.begin(),ivector.end(),6,3);

copy(ivector.begin(),ivector.end(),output);

cout<<endl; 

 

//将所有的元素值3,改为元素值5,结果放置到另一个区间

replace_copy(ivector.begin(),ivector.end(),ivector3.begin(),3,5);

copy(ivector3.begin(),ivector3.end(),output);

cout<<endl; 

 

//将所有小于5的元素值,改为元素值2

replace_if(ivector.begin(),ivector.end(),bind2nd(less<int>(),5),2);

copy(ivector.begin(),ivector.end(),output);

cout<<endl; 

 

//将所有的元素值8,改为元素值9,结果放置到另一个区间

replace_copy_if(ivector.begin(),ivector.end(),ivector3.begin(),

bind2nd(equal_to<int>(),8),9);

copy(ivector3.begin(),ivector3.end(),output);

cout<<endl; 

 

//逆向重排每一个元素

reverse(ivector.begin(),ivector.end());

copy(ivector.begin(),ivector.end(),output);

cout<<endl; 

 

//逆向重排每一个元素,结果置于另一个区间

reverse_copy(ivector.begin(),ivector.end(),ivector3.begin());

copy(ivector3.begin(),ivector3.end(),output);

cout<<endl; 

 

//旋转(互换元素)[first,middle), 和[middle,end)

rotate(ivector.begin(),ivector.begin()+4,ivector.end());

copy(ivector.begin(),ivector.end(),output);

cout<<endl; 

 

//旋转(互换元素)[first,middle], 和[middle,end],结果置于另一个区间,

rotate_copy(ivector.begin(),ivector.begin()+5,ivector.end(),

ivector3.begin());

copy(ivector3.begin(),ivector3.end(),output);

cout<<endl; 

}

 

#include <iostream>

#include <algorithm>

#include <functional>

#include <vector>

using namespace std;

 

void main()

{

int iarray[]={26,17,15,22,23,33,32,40};

vector<int> ivector(iarray,iarray+sizeof(iarray)/sizeof(int));

 

// 查找并输出最大、最小值元素

cout<<*max_element(ivector.begin(),ivector.end())<<endl;

cout<<*min_element(ivector.begin(),ivector.end())<<endl;

 

//将ivector.begin()+4-ivector.begin()各元素排序,

//放进[ivector.begin(),ivector.begin()+4]区间。剩余元素不保证维持原来相对次序

partial_sort(ivector.begin(),ivector.begin()+3,ivector.end());

copy(ivector.begin(),ivector.end(),ostream_iterator<int>(cout," "));

cout<<endl;

 

//局部排序并复制到别处

vector<int> ivector1(5);

partial_sort_copy(ivector.begin(),ivector.end(),ivector1.begin(),

ivector1.end());

copy(ivector1.begin(),ivector1.end(),ostream_iterator<int>(cout," "));

cout<<endl;

 

//排序,缺省为递增。

sort(ivector.begin(),ivector.end());

copy(ivector.begin(),ivector.end(),ostream_iterator<int>(cout," "));

cout<<endl;

 

//将指定元素插入到区间内不影响区间原来排序的最低、最高位置

cout<<*lower_bound(ivector.begin(),ivector.end(),24)<<endl;

cout<<*upper_bound(ivector.begin(),ivector.end(),24)<<endl;

 

//对于有序区间,可以用二分查找方法寻找某个元素

    cout<<binary_search(ivector.begin(),ivector.end(),33)<<endl;

    cout<<binary_search(ivector.begin(),ivector.end(),34)<<endl;

 

//下一个排列组合

next_permutation(ivector.begin(),ivector.end());

copy(ivector.begin(),ivector.end(),ostream_iterator<int>(cout," "));

cout<<endl;

 

//上一个排列组合

prev_permutation(ivector.begin(),ivector.end());

copy(ivector.begin(),ivector.end(),ostream_iterator<int>(cout," "));

cout<<endl;

 

//合并两个序列ivector和ivector1,并将结果放到ivector2中

vector<int> ivector2(13);

merge(ivector.begin(),ivector.end(),ivector1.begin(),ivector1.end(),

ivector2.begin());

copy(ivector2.begin(),ivector2.end(),ostream_iterator<int>(cout," "));

cout<<endl;

 

//将小于*(ivector.begin()+5)的元素放置在该元素之左

//其余置于该元素之右。不保证维持原有的相对位置

nth_element(ivector2.begin(),ivector2.begin()+5,ivector2.end());

copy(ivector2.begin(),ivector2.end(),ostream_iterator<int>(cout," "));

cout<<endl;

 

//排序,并保持原来相对位置

stable_sort(ivector2.begin(),ivector2.end());

copy(ivector2.begin(),ivector2.end(),ostream_iterator<int>(cout," "));

cout<<endl;

 

//针对一个有序区间,找出其中一个子区间,其中每个元素都与某特定元素值相同

pair<vector<int>::iterator,vector<int>::iterator> pairIte;

pairIte=equal_range(ivector2.begin(),ivector2.end(),22);

cout<<*(pairIte.first)<<endl; 

cout<<*(pairIte.second)<<endl;

 

//合并两个有序序列,然后就地替换

int iarray3[] = { 1, 3, 5, 7, 2, 4, 6, 8 };

vector<int> ivector3(iarray3,iarray3+sizeof(iarray3)/sizeof(int));

inplace_merge(ivector3.begin(), ivector3.begin()+ 4, ivector3.end());

copy(ivector3.begin(),ivector3.end(), ostream_iterator<int>(cout, " ")); 

cout<<endl; 

 

//以字典顺序比较序列ivector3和ivector4

int iarray4[] = { 1, 3, 5, 7,1, 5, 9, 3 };

vector<int> ivector4(iarray4,iarray4+sizeof(iarray4)/sizeof(int));

cout<< lexicographical_compare(ivector3.begin(),ivector3.end(),

ivector4.begin(),ivector4.end()) << endl

 

}

 

 

(10) 结构体类型

 

struct temp  

{  

public :  

string str ;   

public :  

int id ;  

}tmp  

int main()  

{  

vector <temp> t ;   

temp w1 ;   

w1.str = "Hellowor" ;  

w1.id = 1 ;   

t.push_back(t1);  

cout << w1.str << "," <<w1.id <<endl ;   

return 0 ;   

抱歉!评论已关闭.