C++におけるvectorコンテナの一般的な操作方法例のまとめ

9895 ワード

1コンテナの最後の要素を取得 
 ------ backまたはrbeginを使用して取得

// back、rbegin            
    std::vector myVector; 
    myVector.back()=3; 
 
 
 
    std::vector::reverse_iterator tailIter; 
    tailIter=myVector.rbegin(); 
    *tailIter=3 

2ある要素を削除するには、ある位置の要素を削除する必要があります.iterator遍歴を使用し、at(i)方式遍歴を使用しないでください.要素を削除するときは、iterator位置に基づいて削除されるからです.要素を削除するときに返される値は、削除した要素の後にある最初の要素の位置です.

#include  
#include  
 
int main( ) 
{ 
  using namespace std;   
  vector  v1; 
  vector ::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  2つのvectorが値を割り当てやすい場合、=で値を割り当てることはできません.遍歴またはassign関数を使用して値を割り当てる必要があります.

//delNode.vectorNode   delPositionVector      
// vector                       ,     assign   
 
VectorNode delNode; 
 
delNode.numberOfFenkuai=nSelect; 
Node nodeTemp; 


エラーの割り当て方法:

//           
  delNode.vectorNode=delPositionVector ; 


正しい付与方法一:遍歴

for (int i=0;i 
 

正しい付与方式2:assign関数

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
   void insert(
   iterator _Where,
   InputIterator _First,
   InputIterator _Last
  );
  

5コンテナ内の要素メソッドの1つを更新します.  まずこの要素の位置を検索し、この位置に更新された要素を追加し、元の要素を削除します.                       または、この要素を検索して、この要素を削除し、この要素の場所に新しい要素の適用例を追加します.

delNode.vectorNode.assign(delPositionVector.begin(),delPositionVector.end()); 
BOOL bInsert=FALSE; 
std::vector ::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は関連性容器ではなく、新しい要素を挿入すると元の取得した反復器が無効になります.

std::vector vNum; 
vNum.push_back(1); 
vNum.push_back(3); 
vNum.push_back(5); 
std::vector::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 mNum; 
mNum[0] = 0; 
mNum[1] = 1; 
mNum[2] = 2; 
std::map::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 2つのシーケンスコンテナをマージ

std::vector::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  
#include  
#include    // For greater( ) 
#include  
 
// Return whether first element is greater than the second 
bool UDgreater ( int elem1, int elem2 ) 
{ 
  return elem1 > elem2; 
} 
 
int main( ) 
{ 
  using namespace std; 
  vector  v1; 
  vector ::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( ) ); 
  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::iterator iter=m_itemVector.begin(); 
for(i=0;iter!=m_itemVector.end();iter++,i++) 
{ 
  if(iter->flag==-1) 
  { 
    break; 
  } 
  iter->flag=1; 
} 

vector::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;iInvalidate();  
 
    CurrentCount--; 
    i--;                        //   i   ,       i        ,    i--。 
  } 
} 


13正の順にループし、逆の順にループします.

vector::iterator iter=m_itemVector.begin(); 
for(i=0;iter!=m_itemVector.end();iter++,i++) //      
{ 
  iter->flag=0; 
} 
 
for (;i>0;)            //       iter   Begin()             
{ 
 
  iter--; //   ,    Begin() 
  i--; 
  iter->flag=1; 
} 

14 VECTORで検索

#include 
#include // VECTOR    
using namespace std; 

vector L; 
L.push_back( 1 ); 
L.push_back( 2 ); 
L.push_back( 3 ); 
L.push_back( 4 ); 
L.push_back( 5 ); 
vector::iterator result = find( L.begin( ), L.end( ), 3 ); //  3 
if ( result == L.end( ) ) //    
  cout << "No" << endl; 
else //   
  cout << "Yes" << endl;