C++中vector容器的常用操作方法實(shí)例總結(jié)
1 獲得容器最后一個(gè)元素
------ 使用 back或rbegin 取得
// back、rbegin 有常量和引用兩種形式
std::vector<int> myVector;
myVector.back()=3;
std::vector<int>::reverse_iterator tailIter;
tailIter=myVector.rbegin();
*tailIter=3
2 刪除某元素
需要?jiǎng)h除某位置的元素,應(yīng)使用iterator遍歷, 不應(yīng)使用at(i) 方式遍歷,因?yàn)閯h除元素時(shí),是根據(jù)iterator位置進(jìn)行刪除的。
刪除元素時(shí),返回值為:位于刪除的元素之后的第一個(gè)的元素所在的位置
#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 容易賦值時(shí),不能通過=來賦值
而應(yīng)使用遍歷 或assign函數(shù)的方式來賦值
//delNode.vectorNode 是與delPositionVector同類型容器 // vector 兩容器不能直接賦值 可通過 遍歷每個(gè)元素賦值,也可使用 assign賦值 VectorNode delNode; delNode.numberOfFenkuai=nSelect; Node nodeTemp;
錯(cuò)誤賦值方式:
// 這是錯(cuò)誤的賦值方式 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位置 插入容器元素
插入某元素時(shí),返回值為插入的那個(gè)元素所在的位置,原先處于此位置的元素將被順次后移
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 更新容器中的某個(gè)元素
辦法之一: 先搜索到這個(gè)元素位置, 在此位置添加更新的元素,刪除原先的元素
或搜索到此元素,刪除此元素,在此元素位置上添加新元素
應(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某元素后,迭代器會(huì)失效 需要重新獲得
STL中的vector不是關(guān)聯(lián)性容器,當(dāng)插入新的元素后,原來取得的迭代器就會(huì)失效。
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!
注意最后一句,運(yùn)行到最后一句時(shí)就會(huì)發(fā)生崩潰,迭代器訪問錯(cuò)誤。插入元素后,要重新取得迭代器。
而對(duì)于map這樣的關(guān)聯(lián)性容器,插入新元素后,原來的迭代器仍然會(huì)有效。
例子如下:
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 合并兩個(gè)順序容器
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 刪除符合條件的項(xiàng)
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() 再減的話 就會(huì)出現(xiàn)問題
{
iter--; //結(jié)束時(shí),正好退到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;
欄 目:C語言
下一篇:C++入門之基礎(chǔ)語法學(xué)習(xí)教程
本文標(biāo)題:C++中vector容器的常用操作方法實(shí)例總結(jié)
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2320.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文


