vector的使用示例

vector是一个容器,可以看做是一个大小可变化的数组,所以其特性有: 

1)大小可变

2)容器内的数据成员只允许是一种;

3)由于vector提供的接口的特性,他可以当做栈来使用

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

定义

头文件 #include<vector>

命名空间 using namespace std;

示例:

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);//v2和v1相同
int iArray[]={11,13,19,23,27};
vector<int> v(iArray,iArray+5);//用数组iArray创建容器 

初始化

1)使用push_back()函数:

vector<string> m_vector;
m_vector.push_back("B08020526");
m_vector.push_back("B08020888");

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

vector<int> Myvector;
Myvector.reserve(4);//限定大小为4
for(unsigned int i=0;i<4;i++)
{
Myvector[i]=i;
}

大小

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

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

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

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

遍历

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 张三 

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;
} 

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

如:

       for (int i=0;i<Myvector.size();i++)
       {
              cout<<Myvector[i].ID<<" "<<Myvector[i].name<<endl;
       } 

反向遍历

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;

        }

2) 使用for_each()算法

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

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

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

      {

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

      }

删除

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

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

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

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

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

4) 用算法remove() 

插入

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]);

查找

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

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<<"\n与stu1相同的个数为"<<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

交换

如: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);

bitset

bitset则是用来方便实现二进制的位操作而设计的库,比较简单。

 

代码示例如下: 

// vector.cpp : 定义控制台应用程序的入口点。
//vector的使用实例
 
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <ctime>
#include <bitset>
using namespace std;
 
int main(int argc, _TCHAR* argv[])
{
srand(clock());
//声明变量
//sizeof(rand_number)是固定的,不随其元素个数变化
vector<int> rand_number;
 
//产生10个随机数
cout << "产生10个100以内的随机数:" << endl;
for( int i=0; i<10; i++ )
rand_number.push_back(rand()%100);
//输出结果,采用下标索引的方式访问,但是可以通过索引来增加元素
for( vector<int>::size_type i=0; i<rand_number.size(); i++ )
cout << rand_number[i] << "  ";
cout << endl;
//通过下标索引可以修改vector内的元素
 
//修改元素内容
cout << "把首元素改成-1后的结果:" << endl;
if( !rand_number.empty() ) rand_number[0] = -1;
//输出通过下标索引修改后的结果
for( vector<int>::size_type i=0; i<rand_number.size(); i++ )
cout << rand_number[i] << "  ";
cout << endl;
 
//删除后面的元素
cout << "删除后面的元素,使得vector内的元素不大于5个:" << endl;
while(rand_number.size() > 5)
{
rand_number.pop_back();//把最后的元素移除
}
//输出删除元素后的结果,通过迭代器输出结果
//end返回的是vector的最末端的下一个元素,指向一个不存在的元素
for( vector<int>::iterator i=rand_number.begin(); i!=rand_number.end(); i++ )
cout << *i << "  "; //通过*(解引用操作符,像C语言中的间访)来读取元素值
cout << endl;
 
//通过迭代器修改元素值,定义的const_iterator只支持访问,不允许修改
cout << "迭代器修改元素值:" << endl;
*rand_number.begin() = 101;//修改首元素
vector<int>::iterator e = --rand_number.end();
*e = 110;//修改最好一个元素
for( vector<int>::iterator i=rand_number.begin(); i!=rand_number.end(); i++ )
cout << *i << "  ";
cout << endl;
cout<<"**************************************************"<<endl;
cout<<"****************bitset的使用**********************"<<endl;
cout<<"***************************************************"<<endl;
//bitset的使用
bitset<15> bit;
cout << "默认的bitset值:" << endl;
//默认初始化都为0,可以分别使用unsigned和string初始化
cout << bit << endl;
//计算bit中1的个数
cout << "bit中1的个数为:" << bit.count() << endl;
//都置为1
bit.set();
cout << "置1后,bit中1的个数为:" << bit.count() << endl;
//都置为0
bit.reset();
cout << "置0后,bit中1的个数为:" << bit.count() << endl;
//将bit的每一位都置反
bit.flip();
cout << "置反后,bit中1的个数为:" << bit.count() << endl;
 
getchar();
return 0;
}

运行结果: 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法哥2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值