概述 C++中的容器大致分为两类:顺序容器和关联容器。以后会逐一讲解。本文主要讲解顺序容器中的vector。 想要使用vector,需要包含头文件vector,即#include<vector>。vector可以理解为可以动态变换长度的数组。

1.定义和初始化


vector<int> vec0;

这种定义只是定义vec0是一个vector,默认大小为0。


vector<int> vec1(10);//初始化vec1,初始化为10个0

这种定义是定义一个vec1,并初始化其长度为10,每个元素默认初始化为0。


vector<int> vec2(10,999);//初始化vec2,初始化为10个999

这种定义是定义一个vec2,并初始化其长度为10,每个元素初始化为999。


vector<int> vec2(vec1);//使用vec1初始化vec2,将vec2初始化为何vec1相同
vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec3,将vec3初始化为何vec1相同

这两种定义都是将vec1复制给新的vector。 在此处出现了两个函数begin()和end()。有必要说明一下这两个函数的作用。以begin()为例,函数原型分为两类:iterator begin()、const_iterator begin()。功能是返回一个当前vector容器中起始元素的迭代器(可直接理解为首地址指针)。end同理。这里的两个迭代器很重要,以后会用的很多。vector还可以采用下标访问各个元素,可一旦到了后面的容器,就不一定可以使用了,因此,迭代器法访问元素必须要会。 2.常见操作


vec1.push_back(100);//添加元素

该操作表示在vec1末尾添加一个元素100


while(!vec1.empty()){//empty  为空时返回值是1,不空返回值是0
     cout<<vec1[vec1.size()-1]<<endl;
     vec1.pop_back();//vec1.pop_back删除末尾元素
 }
 

empty()函数表示当前vector是否为空,为空返回1,不空返回0;pop_back()弹出(删除)末尾元素。


vec1.insert(vec1.end(),5,3);//在末尾插入5个3

insert()函数有三个参量。

cout<<(vec1==vec2)?true:false;  //判断是否相等==、!=、>=、<=...
判断两个vector是否相等。

3.元素获取(遍历方法)

对于vector遍历方法,可以分为两种:下标法和迭代器法。可以思考一下为何支持下标法访问(我的想法为:vector是以数组的方式存取的,因此支持利用下标随机访问)。


//遍历获取元素
//1.迭代器法
vector<int>::iterator iter = vec2.begin();
for(;iter!=vec2.end();iter++){
    cout<<*iter<<endl;
 }
 //2.下标法
 for(int i=0;i<vec2.size();i++){
    cout<<vec2[i]<<endl;
 }
 

4.以上代码的可执行文件


#include <iostream>
#include <vector>
using namespace std;
//就是一个动态数组
int main()
{
   //1.定义和初始化
   vector<int> vec0;
   vector<int> vec1(10,999);//初始化vec1,初始化为10个999
   for(int i=0;i<vec1.size();i++){
      vec1[i]=i+1;
   }
   vector<int> vec2(vec1);//使用vec1初始化vec2,将vec2初始化为何vec1相同
   vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec3,将vec3初始化为何vec1相同

   //2.对vector操作
   vec1.push_back(100);//添加元素
   while(!vec1.empty()){//empty  为空时返回值是1,不空返回值是0
      cout<<vec1[vec1.size()-1]<<endl;
      vec1.pop_back();//vec1.pop_back删除末尾元素
   }
   cout<<endl;
   vec1.insert(vec1.end(),5,3);//在末尾插入5个3
   for(int i=0;i<vec1.size();i++){
      cout<<vec1[i]<<endl;
   }
   cout<<endl;
   for(int i=0;i<vec1.size();i++){
      vec1[i]=i+1;
   }
   //vec1.erase(vec1.begin()+1,vec1.end()-1);//删除之间的元素,其他元素前移  两个元素都是迭代器
   cout<<(vec1==vec2)?true:false;  //判断是否相等==、!=、>=、<=...
   cout<<endl;

   //遍历获取元素
   vector<int>::iterator iter = vec2.begin();//获取迭代器首地址->迭代器就是地址
   for(;iter!=vec2.end();iter++){
      cout<<*iter<<endl;
   }
   //当然了,肯定可以用下标
   for(int i=0;i<vec2.size();i++){
      cout<<vec2[i]<<endl;
   }
   //getchar();
   //getchar();
   return 0;
}