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;