C++におけるvectorコンテナの一般的な操作方法例のまとめ
9895 ワード
1コンテナの最後の要素を取得
------ backまたはrbeginを使用して取得
2ある要素を削除するには、ある位置の要素を削除する必要があります.iterator遍歴を使用し、at(i)方式遍歴を使用しないでください.要素を削除するときは、iterator位置に基づいて削除されるからです.要素を削除するときに返される値は、削除した要素の後にある最初の要素の位置です.
出力:
3 2つのvectorが値を割り当てやすい場合、=で値を割り当てることはできません.遍歴またはassign関数を使用して値を割り当てる必要があります.
エラーの割り当て方法:
正しい付与方法一:遍歴
正しい付与方式2:assign関数
4 指定したiterator位置でコンテナ要素を挿入して要素を挿入すると、挿入した要素の位置に戻り、元の位置の要素は順次後方に移動します.
5コンテナ内の要素メソッドの1つを更新します. まずこの要素の位置を検索し、この位置に更新された要素を追加し、元の要素を削除します. または、この要素を検索して、この要素を削除し、この要素の場所に新しい要素の適用例を追加します.
6 push_backまたはpopのある要素の後、反復器は失効します. 再取得が必要
STLのvectorは関連性容器ではなく、新しい要素を挿入すると元の取得した反復器が無効になります.
最後の文に注意してください.最後の文まで実行するとクラッシュし、反復器アクセスエラーが発生します.要素を挿入したら、反復器を再取得します.
mapのような関連性容器では、新しい要素を挿入すると、元の反復器が有効になります.例は次のとおりです.
7 2つのシーケンスコンテナをマージ
9ソート
10 すべての要素をクリア
11遍歴
12条件を満たす項目を削除する
13正の順にループし、逆の順にループします.
14 VECTORで検索
------ 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;