C++中vector容器的常用操作方法实例总结
1获得容器最后一个元素
------使用back或rbegin取得
//back、rbegin有常量和引用两种形式 std::vector<int>myVector; myVector.back()=3; std::vector<int>::reverse_iteratortailIter; tailIter=myVector.rbegin(); *tailIter=3
2删除某元素
需要删除某位置的元素,应使用iterator遍历,不应使用at(i)方式遍历,因为删除元素时,是根据iterator位置进行删除的。
删除元素时,返回值为:位于删除的元素之后的第一个的元素所在的位置
#include<vector>
#include<iostream>
intmain()
{
usingnamespacestd;
vector<int>v1;
vector<int>::iteratorIter;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
cout<<"v1=";
for(Iter=v1.begin();Iter!=v1.end();Iter++)
cout<<""<<*Iter;
cout<<endl;
v1.erase(v1.begin());
cout<<"v1=";
for(Iter=v1.begin();Iter!=v1.end();Iter++)
cout<<""<<*Iter;
cout<<endl;
v1.erase(v1.begin()+1,v1.begin()+3);
cout<<"v1=";
for(Iter=v1.begin();Iter!=v1.end();Iter++)
cout<<""<<*Iter;
cout<<endl;
}
输出:
v1=1020304050 v1=20304050 v1=2050
3 两vector容易赋值时,不能通过=来赋值
而应使用遍历或assign函数的方式来赋值
//delNode.vectorNode是与delPositionVector同类型容器 //vector两容器不能直接赋值可通过遍历每个元素赋值,也可使用assign赋值 VectorNodedelNode; delNode.numberOfFenkuai=nSelect; NodenodeTemp;
错误赋值方式:
//这是错误的赋值方式 delNode.vectorNode=delPositionVector;
正确赋值方式一:遍历
for(inti=0;i<delPositionVector.size();i++)
{
nodeTemp=delPositionVector.at(i);
delNode.vectorNode.push_back(nodeTemp);
}
正确赋值方式二:assign函数
delNode.vectorNode.assign(delPositionVector.begin(),delPositionVector.end());
4 在指定的iterator位置插入容器元素
插入某元素时,返回值为插入的那个元素所在的位置,原先处于此位置的元素将被顺次后移
iteratorinsert( iterator_Where, constType&_Val ); voidinsert( iterator_Where, size_type_Count, constType&_Val ); template<classInputIterator> voidinsert( iterator_Where, InputIterator_First, InputIterator_Last );
5更新容器中的某个元素
办法之一: 先搜索到这个元素位置,在此位置添加更新的元素,删除原先的元素
                      或搜索到此元素,删除此元素,在此元素位置上添加新元素
应用例子:
delNode.vectorNode.assign(delPositionVector.begin(),delPositionVector.end());
BOOLbInsert=FALSE;
std::vector<VectorNode>::iteratoriter;
for(iter=g_DelVector.begin();iter!=g_DelVector.end();iter++)
{
if((*iter).numberOfFenkuai==nSelect)
{
bInsert=TRUE;
//g_DelVector.erase(iter);
//g_DelVector.insert(iter,delNode);
iter=g_DelVector.insert(iter,delNode);
iter=g_DelVector.erase(iter+1);
iter--;
break;
}
}
if(!bInsert)
{
g_DelVector.push_back(delNode);
}
 
6push_back或pop某元素后,迭代器会失效 需要重新获得
STL中的vector不是关联性容器,当插入新的元素后,原来取得的迭代器就会失效。
std::vector<int>vNum; vNum.push_back(1); vNum.push_back(3); vNum.push_back(5); std::vector<int>::iteratorpIt=vNum.begin(); std::cout<<"Beforeinsertanewnumber:"<<*pIt<<std::endl; vNum.push_back(7); std::cout<<"Afterinsertanewnumber:"<<*pIt<<std::endl;//Oh!No!
注意最后一句,运行到最后一句时就会发生崩溃,迭代器访问错误。插入元素后,要重新取得迭代器。
而对于map这样的关联性容器,插入新元素后,原来的迭代器仍然会有效。
例子如下:
std::map<int,int>mNum;
mNum[0]=0;
mNum[1]=1;
mNum[2]=2;
std::map<int,int>::iteratorpIt=mNum.begin();
std::cout<<"Beforeinsertanewnumber:("<<pIt->first<<","<<pIt->second<<")"<<std::endl;
mNum[3]=3;
std::cout<<"Afterinsertanewnumber:("<<pIt->first<<","<<pIt->second<<")"<<std::endl;//OK!
7合并两个顺序容器
std::vector<line>::iteratori1=v1.begin(),i2=v2.begin();
while(i1!=v1.end()&&i2!=v2.end())
{
if(i1->index==i2->index)
{
linet={i1->index,i1->value1,i2->value2}
v3.push_back(t);
++i1;
++i2;
}
elseif(i1->index>i2->index)
{
i2->value1=0;
v3.push_back(*i2);
++i2;
}
else
{
i1->value2=0;
v3.push_back(*i1);
++i1;
}
}
while(i1!=v1.end())
v3.push_back(*(i1++));
while(i2!=v2.end())
v3.push_back(*(i2++));
9排序
//alg_sort.cpp
//compilewith:/EHsc
#include<vector>
#include<algorithm>
#include<functional>//Forgreater<int>()
#include<iostream>
//Returnwhetherfirstelementisgreaterthanthesecond
boolUDgreater(intelem1,intelem2)
{
returnelem1>elem2;
}
intmain()
{
usingnamespacestd;
vector<int>v1;
vector<int>::iteratorIter1;
inti;
for(i=0;i<=5;i++)
{
v1.push_back(2*i);
}
intii;
for(ii=0;ii<=5;ii++)
{
v1.push_back(2*ii+1);
}
cout<<"Originalvectorv1=(";
for(Iter1=v1.begin();Iter1!=v1.end();Iter1++)
cout<<*Iter1<<"";
cout<<")"<<endl;
sort(v1.begin(),v1.end());
cout<<"Sortedvectorv1=(";
for(Iter1=v1.begin();Iter1!=v1.end();Iter1++)
cout<<*Iter1<<"";
cout<<")"<<endl;
//Tosortindescendingorder.specifybinarypredicate
sort(v1.begin(),v1.end(),greater<int>());
cout<<"Resorted(greater)vectorv1=(";
for(Iter1=v1.begin();Iter1!=v1.end();Iter1++)
cout<<*Iter1<<"";
cout<<")"<<endl;
//Auser-defined(UD)binarypredicatecanalsobeused
sort(v1.begin(),v1.end(),UDgreater);
cout<<"Resorted(UDgreater)vectorv1=(";
for(Iter1=v1.begin();Iter1!=v1.end();Iter1++)
cout<<*Iter1<<"";
cout<<")"<<endl;
}
Originalvectorv1=(02468101357911) Sortedvectorv1=(01234567891011) Resorted(greater)vectorv1=(11109876543210) Resorted(UDgreater)vectorv1=(11109876543210)
10 清空所有元素
m_itemVector.clear();
11遍历
vector<ITEM_CHECK>::iteratoriter=m_itemVector.begin();
for(i=0;iter!=m_itemVector.end();iter++,i++)
{
if(iter->flag==-1)
{
break;
}
iter->flag=1;
}
vector<ITEM_CHECK>::iteratoriter=m_itemVector.begin();
for(i=0;iter!=m_itemVector.end();iter++,i++)//先全部取消
{
iter->flag=0;
}
12删除符合条件的项
intCurrentCount=(int)m_itemVector.size();
for(inti=0;i<CurrentCount;i++)
{
if(m_itemVector.at(i).flag==1)
{
m_itemVector.erase(m_itemVector.begin()+i);
DeleteItem(i);
this->Invalidate();
CurrentCount--;
i--;//删除第i位置后,需要重新判断第i位置是否符合条件,因此需要i--。
}
}
13正序遍历然后反序遍历
vector<ITEM_CHECK>::iteratoriter=m_itemVector.begin();
for(i=0;iter!=m_itemVector.end();iter++,i++)//先全部取消
{
iter->flag=0;
}
for(;i>0;)//从后往前设置iter退到Begin()再减的话就会出现问题
{
iter--;//结束时,正好退到Begin()
i--;
iter->flag=1;
}
14在VECTOR中查找
#include<vector> #include<algorithm>//在VECTOR中查找 usingnamespacestd; vector<int>L; L.push_back(1); L.push_back(2); L.push_back(3); L.push_back(4); L.push_back(5); vector<int>::iteratorresult=find(L.begin(),L.end(),3);//查找3 if(result==L.end())//没找到 cout<<"No"<<endl; else//找到 cout<<"Yes"<<endl;
    
  
