vector容器类的使用[c++ stl]

长平狐 发布于 2012/10/08 15:24
阅读 136
收藏 0

vector容器类的使用

郑海波 2012-4-20 南京

1.     vector容器简介:

vector向量容器是一种随机访问的数组类型,它提供了对数组元素的快速访问、随机访问,以及在序列尾部快速、随机地插入和删除操作。它类似于数据结构中的队列、数组和堆栈等概念。

2.     vector容器的定义

2.1    头文件 #include<vector>

2.2    命名空间 using namespace std;

2.3    举例:

vector<string> m_vector;//定义一个string类型的向量容器

vector<int> m_vector;//定义一个int类型的向量容器

vector<int> m_vector(10);//创建了具有10个元素的容器,每个元素初始值为0

vector<int> m_vector(10,5);//创建具有10个元素的容器,每个元素初始值为5

vector<char> v1(5,’k’);

vector<char> v2(v1);//v2v1相同。

int iArray[]={11,13,19,23,27};

vector<int> v(iArray,iArray+5);//用数组iArray创建容器。

3.     vector容器的初始化

3.1    使用push_back()函数

如:

#pragma warning(disable:4786)

#include <vector>

#include <iostream>

#include <string>

using namespace std;

int main()

{

          vector<string> m_vector;

          m_vector.push_back("B08020526");

          m_vector.push_back("B08020888");

          m_vector.push_back("南邮");

          for (int i=0;i<3;i++)

          {

                   cout<<m_vector[i]<<endl;

          }

          return 0;

}

3.2    预先设定容器大小,使用[]运算符

#pragma warning(disable:4786)

#include <vector>

#include <iostream>

using namespace std;

void main (void)

{

       vector<int> Myvector;

       Myvector.reserve(4);//限定大小为4

       for(unsigned int i=0;i<4;i++)

       {

              Myvector[i]=i;

              cout<<Myvector[i]<<" ";

       }

}

4.     vector容器大小的判断

主要是区分vector的几个函数,它们是size()max_size()capacity()

size:指容器当前存储了多少个元素

max_size:指容器的最大尺寸,一般是一个定值。但是不同的数据类型,有着不同的值。如int1073741823,而double类型的向量容器的max_size: 536870911

capacity:指容器的容量,有reserve()函数确定;当没有reserve()函数确定时,它的值与size相同;

举例:

#pragma warning(disable:4786)

#include <iostream>

#include <vector>

using namespace std ;

typedef vector<int> INTVECTOR;

void main()

{

    INTVECTOR thevector;

    thevector.push_back(42) ;

    cout << "size=" << thevector.size() << endl;

    cout << "max_size=" << thevector.max_size()<< endl;

    cout << "capacity=" << thevector.capacity() << endl;

    thevector.reserve(1000);

    cout << "size is: " << thevector.size() << endl;

    cout << "max_size is: " << thevector.max_size()<< endl;

    cout << "capacity is: " << thevector.capacity() << endl;

}

// size=1

// max_size=1073741823

// capacity=1

// size is: 1

// max_size is: 1073741823

// capacity is: 1000

5.     vector容器的遍历

5.1使用迭代器和循环相结合

#pragma warning(disable:4786)

#include <iostream>

#include <vector>

#include <string>

using namespace std;

struct student

{

         int ID;

         string name;

         student(int i,string n)

         {

                   ID=i;

                   name=n;

         }

};

void main (void)

{

         vector<student> Myvector;

         vector<student>::iterator m_Iterator;//生成迭代器

         student stu1(1,"张三");

         student stu2(4,"李四");

         student stu3(2,"王五");

         student stu4(3,"张三");

         Myvector.push_back(stu1);

         Myvector.push_back(stu2);

         Myvector.push_back(stu3);

         Myvector.push_back(stu4);

         for (m_Iterator=Myvector.begin();m_Iterator!=Myvector.end();m_Iterator++)

         {

                   cout<<m_Iterator->ID<<" "<<m_Iterator->name<<endl;

         }

}

1 张三

4 李四

2 王五

3 张三

5.2使用for_each()算法

#pragma warning(disable:4786)

#include <iostream>

#include <vector>

#include <string>

#include <algorithm>//for_each()

using namespace std;

struct student

{

       int ID;

       string name;

       student(int i,string n)

       {

              ID=i;

              name=n;

       }

};

void OutFun(student &OutStu);//自定义输出函数

void main (void)

{

       vector<student> Myvector;

       student stu1(1,"张三");

       student stu2(4,"李四");

       student stu3(2,"王五");

       student stu4(3,"张三");

       Myvector.push_back(stu1);

       Myvector.push_back(stu2);

       Myvector.push_back(stu3);

       Myvector.push_back(stu4);

       for_each(Myvector.begin(),Myvector.end(),OutFun);

}

void OutFun(student &OutStu)

{

   cout<<OutStu.ID<<" "<<OutStu.name<<endl;

}

5.3使用size()函数及[]运算法符和for循环相结合。

如:

       for (int i=0;i<Myvector.size();i++)

       {

              cout<<Myvector[i].ID<<" "<<Myvector[i].name<<endl;

       }

6.     vector容器的反向遍历

6.1使用迭代器和循环相结合

vector<student>::reverse_iterator m_Iterator;//一定要将迭代器声明为反向迭代器

……..

for (m_Iterator=Myvector.rbegin();m_Iterator!=Myvector.rend();m_Iterator++)

         {

                   cout<<m_Iterator->ID<<" "<<m_Iterator->name<<endl;

        }

 6.2使用for_each()算法

for_each(Myvector.rbegin(),Myvector.rend(),OutFun);

6.3 使用size()函数及[]运算法符和for循环相结合。

      for (int i=Myvector.size()-1;i>=0;i--)

      {

             cout<<Myvector[i].ID<<" "<<Myvector[i].name<<endl;

      }

7.     vector容器的删除操作

7.1调用pop_back()函数,删除向量容器尾部的一个元素;

7.2调用erase();函数,删除由迭代器指向的一个元素,或由迭代器指向的一个区间。

Myvector.erase(Myvector.begin()+1);

Myvector.erase(Myvector.begin(),Myvector.end()-1);

7.3 clear()函数,删除所有的元素

7.4用算法remove()

8.     vector容器插入元素

Myvector.insert(Myvector.begin()+2,2,stu4);

 第一个参数是迭代器类型,表示插入的位置,第二个参数表示参入的个数。第三个参数表示插入的元素。

另外一种表达形式:

student stu_array[4]={stu1,stu2,stu3,stu4};

Myvector.insert(Myvector.begin()+2,&stu_array[0],&stu_array[3]);

9.     vector容器中元素的查找

9.1.很显然,要用算法中的find函数或者find_if函数。当vector中存储的是普通类型,如int,double等时,find的第三个参数,可以是这种类型的一个值;当vector中存储的是一个类时,该类必须重载‘==’运算符

9.2对于find_if,其第三个参数是一个函数名。而且这个函数的返回值必须为bool类型的,而且其参数必须是vector存储的类型的引用。

举例:

//文件名:CHAPTER6-8.cpp

#pragma warning(disable:4786)

#include <iostream>

#include <vector>

#include <string>

#include <algorithm>//for_each()

using namespace std;

class student

{

public:

       int ID;

       string name;

       student(int i,string n)

       {

              ID=i;

              name=n;

       }

       bool operator == (const student& ob) 

       {

              if (ob.ID==ID&&ob.name==name)

              {

                  return true;

              }

              else

              {

                     return false;

              }

       }

};

void OutFun(student &OutStu);

bool ForFindFun(student &OutStu);

void main (void)

{

       vector<student> Myvector;

       vector<student>::iterator m_Iterator;

       student stu1(1,"张三");

       student stu2(4,"李四");

       student stu3(2,"王五");

       student stu4(3,"赵六");

       Myvector.push_back(stu1);

       Myvector.push_back(stu2);

       Myvector.push_back(stu3);

       Myvector.push_back(stu4);

       for (m_Iterator=Myvector.begin();m_Iterator!=Myvector.end();m_Iterator++)

       {

              cout<<m_Iterator->ID<<" "<<m_Iterator->name<<endl;

       }

    cout<<"----------------------------------------"<<endl;

       for_each(Myvector.rbegin(),Myvector.rend(),OutFun);

    cout<<"----------------------------------------"<<endl;

       /*m_Iterator=remove(Myvector.begin(),Myvector.end(),&stu2);*/

       Myvector.insert(Myvector.begin()+2,2,stu4);

       for_each(Myvector.begin(),Myvector.end(),OutFun);

//   student stu_array[4]={stu1,stu2,stu3,stu4};

//  Myvector.insert(Myvector.begin()+2,&stu_array[0],&stu_array[3]);

//   for_each(Myvector.begin(),Myvector.end(),OutFun);

       int var_count(0);

       var_count=count(Myvector.begin(),Myvector.end(),stu1);

       cout<<"\nstu1相同的个数为"<<var_count<<endl;

       var_count=count_if(Myvector.begin(),Myvector.end(),ForFindFun);

       cout<<"\nID大于2的个数有:"<<var_count<<endl;}

void OutFun(student &OutStu)

{

   cout<<OutStu.ID<<" "<<OutStu.name<<endl;

}

bool ForFindFun(student &OutStu)

{

       if (OutStu.ID>2)

       {

          return true;

       }

       return false;

}//输出结果为:

1 张三

4 李四

2 王五

3 赵六

----------------------------------------

3 赵六

2 王五

4 李四

1 张三

----------------------------------------

1 张三

4 李四

3 赵六

3 赵六

2 王五

3 赵六

stu1相同的个数为1

ID大于2的个数有:4

10.  vector容器中元素的排序

//文件名:CHAPTER6-8.cpp

#pragma warning(disable:4786)

#include <iostream>

#include <vector>

#include <string>

#include <algorithm>//for_each()

using namespace std;

class student

{

public:

       int ID;

       string name;

       student(int i,string n)

       {

              ID=i;

              name=n;

       }

       bool operator == (const student& ob) 

       {

              if (ob.ID==ID&&ob.name==name)

              {

                  return true;

              }

              else

              {

                     return false;

              }

       }

};

void OutFun(student &OutStu);

bool ForFindFun(student &OutStu);

bool MySort(student &stuE,student&Temp_stu);

void main (void)

{

       vector<student> Myvector;

       vector<student>::iterator m_Iterator;

       student stu1(1,"张三");

       student stu2(4,"李四");

       student stu3(2,"王五");

       student stu4(3,"赵六");

       Myvector.push_back(stu1);

       Myvector.push_back(stu2);

       Myvector.push_back(stu3);

       Myvector.push_back(stu4);

       for (m_Iterator=Myvector.begin();m_Iterator!=Myvector.end();m_Iterator++)

       {

              cout<<m_Iterator->ID<<" "<<m_Iterator->name<<endl;

       }

    cout<<"----------------------------------------"<<endl;

       for_each(Myvector.rbegin(),Myvector.rend(),OutFun);

    cout<<"----------------------------------------"<<endl;

       m_Iterator=remove(Myvector.begin(),Myvector.end(),stu2);

       Myvector.insert(Myvector.begin()+2,2,stu4);

       for_each(Myvector.begin(),Myvector.end(),OutFun);

//   student stu_array[4]={stu1,stu2,stu3,stu4};

//  Myvector.insert(Myvector.begin()+2,&stu_array[0],&stu_array[3]);

//   for_each(Myvector.begin(),Myvector.end(),OutFun);

       int var_count(0);

       var_count=count(Myvector.begin(),Myvector.end(),stu1);

       cout<<"\nstu1相同的个数为"<<var_count<<endl;

       var_count=count_if(Myvector.begin(),Myvector.end(),ForFindFun);

       cout<<"\nID大于2的个数有:"<<var_count<<endl;

      

       cout<<"---------------整理结果--------------------"<<endl;

       for (int i=Myvector.size();i>0;i--)

       {

              sort(Myvector.begin(),Myvector.end(),MySort);

       }

       for_each(Myvector.begin(),Myvector.end(),OutFun);

 

}

void OutFun(student &OutStu)

{

   cout<<OutStu.ID<<" "<<OutStu.name<<endl;

}

bool ForFindFun(student &OutStu)

{

       if (OutStu.ID>2)

       {

              return true;

       }

       return false;

}

bool MySort(student &stuE,student&Temp_stu)

{

   // student temp(0,"");

       if (stuE.ID>Temp_stu.ID)

       {

              student temp(stuE.ID,stuE.name);

        stuE.ID=Temp_stu.ID;

              stuE.name=Temp_stu.name;

              Temp_stu.ID=temp.ID;

              Temp_stu.name=temp.name;

       }

       return true;

}

11.  vector容器中元素的交换

如:swap(stu1,stu2);

那么就相当于stu1的值和stu2的值进行了交换。

如:将MySort修改如下,结果仍然不变。

bool MySort(student &stuE,student&Temp_stu)

{

   // student temp(0,"");

       if (stuE.ID>Temp_stu.ID)

       {

              swap(stuE,Temp_stu);

       }

       return true;

}

当然,也可以进行容器的交换。

如:

vector<int > v1;

vector<int > v2;

v1.swap(v2);

 

转载请注明:http://blog.csdn.net/nuptboyzhb/article/details/7482923


原文链接:http://blog.csdn.net/nuptboyzhb/article/details/7482923
加载中
返回顶部
顶部