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 50v1 = 20 30 40 50v1 = 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 定義的是結構 不是變數 所以不能在其前 加 externstruct 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 secondbool 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);}