C++中vector容器的常用操作方法實例總結(jié)
1 獲得容器最后一個元素
------ 使用 back或rbegin 取得
// back、rbegin 有常量和引用兩種形式 std::vector<int> myVector; myVector.back()=3; std::vector<int>::reverse_iterator tailIter; tailIter=myVector.rbegin(); *tailIter=3
2 刪除某元素
需要刪除某位置的元素,應(yīng)使用iterator遍歷, 不應(yīng)使用at(i) 方式遍歷,因為刪除元素時,是根據(jù)iterator位置進行刪除的。
刪除元素時,返回值為:位于刪除的元素之后的第一個的元素所在的位置
#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; }
輸出:
v1 = 10 20 30 40 50 v1 = 20 30 40 50 v1 = 20 50
3 兩vector 容易賦值時,不能通過=來賦值
而應(yīng)使用遍歷 或assign函數(shù)的方式來賦值
//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函數(shù)
delNode.vectorNode.assign(delPositionVector.begin(),delPositionVector.end());
4 在指定的iterator位置 插入容器元素
插入某元素時,返回值為插入的那個元素所在的位置,原先處于此位置的元素將被順次后移
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 );
5 更新容器中的某個元素
辦法之一: 先搜索到這個元素位置, 在此位置添加更新的元素,刪除原先的元素
或搜索到此元素,刪除此元素,在此元素位置上添加新元素
應(yīng)用例子:
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某元素后,迭代器會失效 需要重新獲得
STL中的vector不是關(guān)聯(lián)性容器,當(dāng)插入新的元素后,原來取得的迭代器就會失效。
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!
注意最后一句,運行到最后一句時就會發(fā)生崩潰,迭代器訪問錯誤。插入元素后,要重新取得迭代器。
而對于map這樣的關(guān)聯(lián)性容器,插入新元素后,原來的迭代器仍然會有效。
例子如下:
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++));
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 )
10 清空所有元素
m_itemVector.clear();
11 遍歷
vector<ITEM_CHECK>::iterator iter=m_itemVector.begin(); for(i=0;iter!=m_itemVector.end();iter++,i++) { if(iter->flag==-1) { break; } iter->flag=1; } vector<ITEM_CHECK>::iterator iter=m_itemVector.begin(); for(i=0;iter!=m_itemVector.end();iter++,i++) //先全部取消 { iter->flag=0; }
12 刪除符合條件的項
int CurrentCount=(int)m_itemVector.size(); for(int i=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>::iterator iter=m_itemVector.begin(); for(i=0;iter!=m_itemVector.end();iter++,i++) //先全部取消 { iter->flag=0; } for (;i>0;) //從后往前設(shè)置 iter 退到Begin() 再減的話 就會出現(xiàn)問題 { iter--; //結(jié)束時,正好退到Begin() i--; iter->flag=1; }
14 在VECTOR中查找
#include<vector> #include<algorithm> //在VECTOR中查找 using namespace std; 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>::iterator result = find( L.begin( ), L.end( ), 3 ); //查找3 if ( result == L.end( ) ) //沒找到 cout << "No" << endl; else //找到 cout << "Yes" << endl;
相關(guān)文章
C語言對CSV文件從最后往前一行一行讀取的實現(xiàn)方法
今天小編就為大家分享一篇關(guān)于C語言對CSV文件從最后往前一行一行讀取的實現(xiàn)方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12c語言中malloc、realloc與calloc 的區(qū)別以及聯(lián)系
以下是對c語言中的malloc函數(shù),realloc函數(shù)與calloc函數(shù)的區(qū)別以及它們之間的聯(lián)系進行了介紹,需要的朋友可以過來參考下2013-08-08C語言實現(xiàn)通訊管理系統(tǒng)設(shè)計
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)通訊管理系統(tǒng)設(shè)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01vc中float與DWORD的互想轉(zhuǎn)換實現(xiàn)代碼
這篇文章主要介紹了vc中float與DWORD的互想轉(zhuǎn)換實現(xiàn)代碼,需要的朋友可以參考下2017-06-06利用C語言實現(xiàn)“百馬百擔(dān)”問題方法示例
百馬百擔(dān)是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語言實現(xiàn)“百馬百擔(dān)”問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12