最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中vector容器的常用操作方法實(shí)例總結(jié)

 更新時(shí)間:2016年05月11日 18:07:34   作者:古典小說(shuō)網(wǎng)-  
vector容器一般被用作創(chuàng)建動(dòng)態(tài)數(shù)組,動(dòng)態(tài)數(shù)組就像Python中的list結(jié)構(gòu)一樣,可以比普通數(shù)組擁有更豐富操作方法,下面就為大家整理了一些最常用的操作:

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í),不能通過(guò)=來(lái)賦值
而應(yīng)使用遍歷 或assign函數(shù)的方式來(lái)賦值

//delNode.vectorNode 是與delPositionVector同類型容器 
// vector 兩容器不能直接賦值 可通過(guò) 遍歷每個(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)插入新的元素后,原來(lái)取得的迭代器就會(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ā)生崩潰,迭代器訪問(wèn)錯(cuò)誤。插入元素后,要重新取得迭代器。

而對(duì)于map這樣的關(guān)聯(lián)性容器,插入新元素后,原來(lái)的迭代器仍然會(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)問(wè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( ) ) //沒(méi)找到 
  cout << "No" << endl; 
else //找到 
  cout << "Yes" << endl; 

    
  

相關(guān)文章

  • C語(yǔ)言?超詳細(xì)講解算法的時(shí)間復(fù)雜度和空間復(fù)雜度

    C語(yǔ)言?超詳細(xì)講解算法的時(shí)間復(fù)雜度和空間復(fù)雜度

    算法復(fù)雜度分為時(shí)間復(fù)雜度和空間復(fù)雜度。其作用:?時(shí)間復(fù)雜度是度量算法執(zhí)行的時(shí)間長(zhǎng)短;而空間復(fù)雜度是度量算法所需存儲(chǔ)空間的大小
    2022-03-03
  • 深入理解線程安全與Singleton

    深入理解線程安全與Singleton

    在編譯器未優(yōu)化的情況下順序如下:1.new operator分配適當(dāng)?shù)膬?nèi)存;2.在分配的內(nèi)存上構(gòu)造Singleton對(duì)象;3.內(nèi)存地址賦值給_instance
    2013-09-09
  • 如何在Qt中實(shí)現(xiàn)關(guān)于Json?的操作

    如何在Qt中實(shí)現(xiàn)關(guān)于Json?的操作

    JSON是一種輕量級(jí)數(shù)據(jù)交換格式,常用于客戶端和服務(wù)端的數(shù)據(jù)交互,不依賴于編程語(yǔ)言,在很多編程語(yǔ)言中都可以使用JSON,這篇文章主要介紹了在Qt中實(shí)現(xiàn)關(guān)于Json的操作,需要的朋友可以參考下
    2023-08-08
  • C++ 多態(tài)性虛函數(shù)和動(dòng)態(tài)綁定學(xué)習(xí)筆記

    C++ 多態(tài)性虛函數(shù)和動(dòng)態(tài)綁定學(xué)習(xí)筆記

    這篇文章主要為大家介紹了C++ 多態(tài)性虛函數(shù)和動(dòng)態(tài)綁定學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • C++日期與時(shí)間 chrono庫(kù)介紹及使用教程

    C++日期與時(shí)間 chrono庫(kù)介紹及使用教程

    chrono庫(kù)是C++11中的一個(gè)標(biāo)準(zhǔn)庫(kù),它提供了一系列與時(shí)間相關(guān)的類和函數(shù),用于表示和處理時(shí)間間隔,時(shí)鐘和時(shí)間點(diǎn),C++20新增Calendar,這篇文章主要介紹了C++日期與時(shí)間 chrono庫(kù)介紹及使用,需要的朋友可以參考下
    2023-12-12
  • matlab?GUI指紋識(shí)別門禁系統(tǒng)介紹及源碼實(shí)現(xiàn)

    matlab?GUI指紋識(shí)別門禁系統(tǒng)介紹及源碼實(shí)現(xiàn)

    這篇文章主要為大家介紹了matlab?GUI指紋識(shí)別門禁系統(tǒng)的介紹及源碼實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • C++如何刪除map容器中指定值的元素詳解

    C++如何刪除map容器中指定值的元素詳解

    map容器是C++ STL中的重要一員,刪除map容器中value為指定元素的問(wèn)題是我們經(jīng)常與遇到的一個(gè)問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于利用C++如何刪除map容器中指定值的元素的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-06-06
  • C++函數(shù)模板與類模板實(shí)例解析

    C++函數(shù)模板與類模板實(shí)例解析

    這篇文章主要介紹了C++函數(shù)模板與類模板,需要的朋友可以參考下
    2014-08-08
  • C語(yǔ)言單向鏈表的表示與實(shí)現(xiàn)實(shí)例詳解

    C語(yǔ)言單向鏈表的表示與實(shí)現(xiàn)實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言單向鏈表的表示與實(shí)現(xiàn),需要的朋友可以參考下
    2014-07-07
  • C++迭代器失效的避坑指南

    C++迭代器失效的避坑指南

    在?C++?中,迭代器(iterator)?是一種類似指針的對(duì)象,用于遍歷?STL?容器(如?vector、list、map?等),迭代器失效?是指在對(duì)容器進(jìn)行某些操作后,原本有效的迭代器變得不可用,所以本文介紹了C++迭代器失效的避坑指南,需要的朋友可以參考下
    2025-05-05

最新評(píng)論

永和县| 九龙坡区| 九龙城区| 紫阳县| 周宁县| 峡江县| 长兴县| 东港市| 社会| 育儿| 夹江县| 莆田市| 青河县| 太康县| 禄劝| 秭归县| 高邑县| 揭东县| 文水县| 高要市| 诏安县| 定日县| 昌邑市| 岚皋县| 中山市| 繁峙县| 炎陵县| 黎平县| 宝坻区| 南通市| 高密市| 夏邑县| 苍梧县| 象州县| 县级市| 台北县| 海原县| 巴林左旗| 福建省| 五大连池市| 永春县|