首页 > 代码库 > vector容器使用总结?.xml
vector容器使用总结?.xml
<style
type="text/css">
pre{
line-height:1;
color:#38ede1;
background-color:#5b2814;
font-size:16px;}.sysFunc{color:#008080;font-style:italic;font-weight:bold;}
.selfFuc{color:#008080;}
.bool{color:#952fa4;}
.condition{color:#ca5cb9;font-weight:bold;}
.key{color:#85d7e6;}
.var{color:#a6caf0;font-style:italic;}
.Digit{color:#c0c0c0;font-weight:bold;}
.includePre{color:#e1ed38;}
.operator?{color:#6de9b8;font-weight:bold;}
</style>
1?获得容器最后一个元素??------?使用?back或rbegin?取得
?
????//??back、rbegin?有常量和引用两种形式?? ????????????std::vector<int>?myVector;?? ????????????myVector.back()=3;?? ?????? ?????? ?????? ????????????std::vector<int>::reverse_iterator?tailIter;?? ????????????tailIter=myVector.rbegin();?? ????????????*tailIter=3?? ?
2?删除某元素?
???需要删除某位置的元素,应使用iterator遍历,?不应使用at(i)?方式遍历,因为删除元素时,是根据iterator位置进行删除的。 ???删除元素时,返回值为:位于删除的元素之后的第一个的元素所在的位置 ? ? MSDN解释: Removes?an?element?or?a?range?of?elements?in?a?vector?from?specified?positions. ? iterator?erase( ???iterator?_Where ); iterator?erase( ???iterator?_First, ???iterator?_Last ); ? ????Position?of?the?element?to?be?removed?from?the?vector. _First ????Position?of?the?first?element?removed?from?the?vector. _Last ????Position?just?beyond?the?last?element?removed?from?the?vector. ????An?iterator?that?designates?the?first?element?remaining?beyond?any?elements?removed,?or?a?pointer?to?the?end?of?the?vector?if?no?such?element?exists. ? MSDN示例:
????#include?<vector>?? ????#include?<iostream>?? ?????? ????int?main(?)?? ????{?? ???????using?namespace?std;????? ???????vector?<int>?v1;?? ???????vector?<int>::iterator?Iter;?? ????????? ???????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;?? ????}?? ? Output ? v1?=?10?20?30?40?50 v1?=?20?30?40?50 v1?=?20?50 ? ? ? ?
3??两vector?容易赋值时,不能通过=来赋值
而应使用遍历?或assign函数的方式来赋值
?
???????//delNode.vectorNode?是与delPositionVector同类型容器?? ????//?vector?两容器不能直接赋值??可通过?遍历每个元素赋值,也可使用?assign赋值?? ?????? ????VectorNode?delNode;?? ?????? ????delNode.numberOfFenkuai=nSelect;?? ????Node?nodeTemp;?? ?
错误赋值方式:
????//?这是错误的赋值方式??
????????delNode.vectorNode=delPositionVector?;??
正确赋值方式一:?遍历
?
????for?(int?i=0;i<delPositionVector.size();i++)?? ????{?? ????????nodeTemp=delPositionVector.at(i);?? ????????delNode.vectorNode.push_back(nodeTemp);?? ????}?? ?
正确赋值方式二:?assign函数
?
????delNode.vectorNode.assign(delPositionVector.begin(),delPositionVector.end());?? ? MSDN?示例:
????#include?<vector>?? ????#include?<iostream>?? ?????? ????int?main(?)?? ????{?? ???????using?namespace?std;?? ???????vector<int>?v1,?v2,?v3;?? ???????vector<int>::iterator?iter;?? ?????? ???????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;?? ?????? ???????v2.assign(v1.begin(),?v1.end());?? ???????cout?<<?"v2?=?";?? ???????for?(iter?=?v2.begin();?iter?!=?v2.end();?iter++)?? ??????????cout?<<?*iter?<<?"?";?? ???????cout?<<?endl;?? ?????? ???????v3.assign(7,?4)?;?? ???????cout?<<?"v3?=?";?? ???????for?(iter?=?v3.begin();?iter?!=?v3.end();?iter++)?? ??????????cout?<<?*iter?<<?"?";?? ???????cout?<<?endl;?? ????}?? ??????? ?????? ????Output?? ???????? ????v1?=?10?20?30?40?50??? ????v2?=?10?20?30?40?50??? ????v3?=?4?4?4?4?4?4?4??? ??????? ?
4??在指定的iterator位置?插入容器元素
????插入某元素时,返回值为插入的那个元素所在的位置,原先处于此位置的元素将被顺次后移 ? MSDN:?解释及示例 ? iterator?insert( ???iterator?_Where, ???const?Type&?_Val ); void?insert( ???iterator?_Where, ???size_type?_Count, ???const?Type&?_Val ); template<class?InputIterator> ??????void?insert( ??????iterator?_Where, ??????InputIterator?_First, ??????InputIterator?_Last ???); ? _Where ????The?position?in?the?vector?where?the?first?element?is?inserted. _Val ????The?value?of?the?element?being?inserted?into?the?vector. _Count ????The?number?of?elements?being?inserted?into?the?vector. _First ????The?position?of?the?first?element?in?the?range?of?elements?to?be?copied. _Last ????The?position?of?the?first?element?beyond?the?range?of?elements?to?be?copied. ????The?first?insert?function?returns?an?iterator?that?points?to?the?position?where?the?new?element?was?inserted?into?the?vector. ????Any?insertion?operation?can?be?expensive,?see?vector?Class?for?a?discussion?ofvector?performance.
5?更新容器中的某个元素
?办法之一:??先搜索到这个元素位置,?在此位置添加更新的元素,删除原先的元素 ???????????????????????或搜索到此元素,删除此元素,在此元素位置上添加新元素
应用例子:
????delNode.vectorNode.assign(delPositionVector.begin(),delPositionVector.end());?? ?????? ?????? ????BOOL?bInsert=FALSE;?? ????std::vector?<VectorNode>::iterator?iter;?? ????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);?? ????}?? ?
6?push_back或pop某元素后,迭代器会失效??需要重新获得
?
CSDN?论坛中例子:
STL中的vector不是关联性容器,当插入新的元素后,原来取得的迭代器就会失效。
例子如下:
????std::vector<int>?vNum;?? ????vNum.push_back(1);?? ????vNum.push_back(3);?? ????vNum.push_back(5);?? ????std::vector<int>::iterator?pIt?=?vNum.begin();?? ????std::cout?<<?"Before?insert?a?new?number:?"?<<?*pIt?<<?std::endl;?? ????vNum.push_back(7);?? ????std::cout?<<?"After?insert?a?new?number:?"?<<?*pIt?<<?std::endl;????//?Oh!?No!??
注意最后一句,运行到最后一句时就会发生崩溃,迭代器访问错误。插入元素后,要重新取得迭代器。
而对于map这样的关联性容器,插入新元素后,原来的迭代器仍然会有效。
例子如下:
????std::map<int,?int>?mNum;?? ????mNum[0]?=?0;?? ????mNum[1]?=?1;?? ????mNum[2]?=?2;?? ????std::map<int,?int>::iterator?pIt?=?mNum.begin();?? ????std::cout?<<?"Before?insert?a?new?number:?("?<<?pIt->first?<<?",?"?<<?pIt->second?<<?")"?<<?std::endl;?? ????mNum[3]?=?3;?? ????std::cout?<<?"After?insert?a?new?number:?("?<<?pIt->first?<<?",?"?<<?pIt->second?<<?")"?<<?std::endl;?//?OK!?? ? ?
7?合并两个顺序容器?
?
????std::vector<line>::iterator?i1?=?v1.begin(),?i2?=?v2.begin();?? ????while(i1?!=?v1.end()?&&?i2?!=?v2.end())?? ????{?? ????????if(i1->index?==?i2->index)?? ????????{?? ????????????line?t?=?{?i1->index,?i1->value1,?i2->value2?}?? ????????????v3.push_back(t);?? ????????????++i1;?? ????????????++i2;?? ????????}?? ????????else?if(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++));?? ?
自己的例子:
????//?删除线?? ????std::vector<Node>??delPosition;?? ?????? ????for?(int?i=0;i<g_DelVector.size();i++)?? ????{?? ????????if?(g_DelVector.at(i).numberOfFenkuai==nSelect)?? ????????{?? ????????????delPosition.assign(g_DelVector.at(i).vectorNode.begin(),g_DelVector.at(i).vectorNode.end());?? ????????????break;?? ????????}?? ????}?? ?????? ?????? ????//??设置?underLine?下划线?? ????std::vector<Node>??underLinePosition;?? ?????? ????for?(int?i=0;i<g_underLineVector.size();i++)?? ????{?? ????????if?(g_underLineVector.at(i).numberOfFenkuai==nSelect)?? ????????{?? ????????????underLinePosition.assign(g_underLineVector.at(i).vectorNode.begin(),g_underLineVector.at(i).vectorNode.end());?? ????????????break;?? ????????}?? ????}?? ?????? ?????? ????//?合并删除线?和?下划线?位置?? ????Node?node;?? ????std::vector<Node>?erasePosition;?? ????std::vector<Node>::iterator?i1=delPosition.begin(),i2=underLinePosition.begin();?? ?????? ????while?(i1!=delPosition.end()&&i2!=underLinePosition.end())?? ????{?? ????????if?(i1->nStart==i2->nEnd)?//?合并??同时前进++?? ????????{?? ????????????node.nStart=i2->nStart;?? ????????????node.nEnd=i1->nEnd;?? ????????????i1++;?? ????????????i2++;?? ?????? ????????????erasePosition.push_back(node);?? ????????????continue;?? ????????}?? ?????? ????????if?(i1->nEnd==i2->nStart)?? ????????{?? ????????????node.nStart=i1->nStart;?? ????????????node.nEnd=i2->nEnd;?? ????????????i1++;?? ????????????i2++;?? ????????????erasePosition.push_back(node);?? ????????????continue;?? ????????}?? ?????? ?????? ????????if?(i1->nEnd<i2->nStart)?? ????????{?? ????????????node=*i1;?? ????????????i1++;?? ????????????erasePosition.push_back(node);?? ????????????continue;?? ????????}?? ?????? ????????if?(i1->nStart>i2->nEnd)?? ????????{?? ????????????node=*i2;?? ????????????i2++;?? ????????????erasePosition.push_back(node);?? ????????????continue;?? ????????}?? ????}?? ?????? ?????? ????while(i1!=delPosition.end())?? ????????erasePosition.push_back(*(i1++));?? ?????? ?????? ????while(i2!=underLinePosition.end())?? ????????erasePosition.push_back(*(i2++));?? ?????? ?????? ????/??整理erasePositon,?使得首尾相连的地方?进行合并?? ?????? ????std::vector<Node>::iterator?iter1,iter2;?? ????for?(iter1=erasePosition.begin();iter1!=erasePosition.end();)?? ????{?? ????????iter2=iter1+1;?? ????????if?(iter2!=erasePosition.end())?? ????????{?? ????????????if?(iter1->nEnd==iter2->nStart)?? ????????????{?? ????????????????iter1->nEnd=iter2->nEnd;?? ????????????????iter1=erasePosition.erase(iter2);?? ????????????????iter1--;?? ????????????????continue;?? ????????????}?? ???????????????? ????????}?? ?????????? ????????iter1++;?? ????}?? ?????? ?????? ????trueString=_T("");?? ????CString?mixString;?? ????GetRichEditCtrl().GetWindowText(mixString);?? ?????? ????int?nStart=0;?? ????for?(iter1=erasePosition.begin();iter1!=erasePosition.end();iter1++)?? ????{?? ????????trueString+=mixString.Mid(nStart,iter1->nStart-nStart);?? ????????nStart=iter1->nEnd;?? ????}?? ?????? ????trueString+=mixString.Mid(nStart);?? ? ?
8??创建全局VECTOR变量,其元素仍为VECTOR类型?----?相当于二维数组??
? stdafx.h
定义数据结构,及声明变量
?
????//-------------struct?定义的是结构??不是变量??所以不能在其前?加??extern?? ????struct?Node{?? ?????? ????????int?nStart;?? ????????int?nEnd;?? ????};?? ?????? ?????? ?????struct?VectorNode{?? ?????? ????????std::vector<Node>?vectorNode;?? ????????int??numberOfFenkuai;//?分块号?? ????};?? ?????? ?????? ????extern?std::vector?<VectorNode>???g_DelVector;???//??声明的是变量??,可以加extern??表示全局变量?? ????extern?std::vector?<VectorNode>?g_AddVector;?? stdafx.cpp??为.H中所声明的变量进行定义 ?
????#include?"stdafx.h"?? ?????? ?????? ?????std::vector?<VectorNode>???g_DelVector;?? ?????std::vector?<VectorNode>?g_AddVector;?? ? ?
9?排序
????//?alg_sort.cpp?? ????//?compile?with:?/EHsc?? ????#include?<vector>?? ????#include?<algorithm>?? ????#include?<functional>??????//?For?greater<int>(?)?? ????#include?<iostream>?? ?????? ????//?Return?whether?first?element?is?greater?than?the?second?? ????bool?UDgreater?(?int?elem1,?int?elem2?)?? ????{?? ???????return?elem1?>?elem2;?? ????}?? ?????? ????int?main(?)?? ????{?? ???????using?namespace?std;?? ???????vector?<int>?v1;?? ???????vector?<int>::iterator?Iter1;?? ?????? ???????int?i;?? ???????for?(?i?=?0?;?i?<=?5?;?i++?)?? ???????{?? ??????????v1.push_back(?2?*?i?);?? ???????}?? ?????? ???????int?ii;?? ???????for?(?ii?=?0?;?ii?<=?5?;?ii++?)?? ???????{?? ??????????v1.push_back(?2?*?ii?+?1?);?? ???????}?? ?????? ???????cout?<<?"Original?vector?v1?=?(?"?;?? ???????for?(?Iter1?=?v1.begin(?)?;?Iter1?!=?v1.end(?)?;?Iter1++?)?? ??????????cout?<<?*Iter1?<<?"?";?? ???????cout?<<?")"?<<?endl;?? ?????? ???????sort(?v1.begin(?),?v1.end(?)?);?? ???????cout?<<?"Sorted?vector?v1?=?(?"?;?? ???????for?(?Iter1?=?v1.begin(?)?;?Iter1?!=?v1.end(?)?;?Iter1++?)?? ??????????cout?<<?*Iter1?<<?"?";?? ???????cout?<<?")"?<<?endl;?? ?????? ???????//?To?sort?in?descending?order.?specify?binary?predicate?? ???????sort(?v1.begin(?),?v1.end(?),?greater<int>(?)?);?? ???????cout?<<?"Resorted?(greater)?vector?v1?=?(?"?;?? ???????for?(?Iter1?=?v1.begin(?)?;?Iter1?!=?v1.end(?)?;?Iter1++?)?? ??????????cout?<<?*Iter1?<<?"?";?? ???????cout?<<?")"?<<?endl;?? ?????? ???????//?A?user-defined?(UD)?binary?predicate?can?also?be?used?? ???????sort(?v1.begin(?),?v1.end(?),?UDgreater?);?? ???????cout?<<?"Resorted?(UDgreater)?vector?v1?=?(?"?;?? ???????for?(?Iter1?=?v1.begin(?)?;?Iter1?!=?v1.end(?)?;?Iter1++?)?? ??????????cout?<<?*Iter1?<<?"?";?? ???????cout?<<?")"?<<?endl;?? ????}?? ?
????Original?vector?v1?=?(?0?2?4?6?8?10?1?3?5?7?9?11?)?? ????Sorted?vector?v1?=?(?0?1?2?3?4?5?6?7?8?9?10?11?)?? ????Resorted?(greater)?vector?v1?=?(?11?10?9?8?7?6?5?4?3?2?1?0?)?? ????Resorted?(UDgreater)?vector?v1?=?(?11?10?9?8?7?6?5?4?3?2?1?0?)?? ?
自己的例子:??Vector容器?存放的CString变量
????std::vector?<CString>?m_VectorImgName;??
????#include?"algorithm"?? ?????? ????BOOL?STLSort(const?CString?&s1,const?CString?&s2)?? ????{?? ????????int?i,j;?? ?????? ????????CString??name1=s1.Right(s1.GetLength()-s1.ReverseFind(L‘\\‘)-1);?? ????????CString??name2=s2.Right(s2.GetLength()-s2.ReverseFind(L‘\\‘)-1);;?? ?????? ????????????i=_ttoi(name1.Left(name1.Find(L‘.‘)));?? ????????????j=_ttoi(name2.Left(name2.Find(L‘.‘)));?? ?????? ????????return?i<j;?? ????}?? ?
????if(m_VectorImgName.size()>0)?? ????{?? ?????? ????????std::sort(m_VectorImgName.begin(),m_VectorImgName.end(),STLSort);??
本文使用?书画小说软件?发布,内容与软件无关,书画小说软件?更惬意的读、更舒心的写、更轻松的发布。
vector容器使用总结?.xml
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。