C++vectorコンテナfind eraseの使用:指定した要素を検索して削除する
34159 ワード
コンセプト:コンテナ、反復器、アルゴリズム
STLには、コンテナ、反復器、アルゴリズムが含まれます.
コンテナは、関連するデータ型を管理するために使用されます.各コンテナにはメリットとデメリットがあり、異なるコンテナはプログラム設計の異なるニーズを反映しています.コンテナ自体は、配列またはチェーンテーブルによって実装されるか、コンテナ内の各要素に特別なキー値があります.
反復器は、データセットの各要素を巡回するために使用されます.これらのデータセットは、コンテナまたはコンテナのサブセットである可能性があります.反復器の主な利点は、任意のタイプの容器にコンパクトで汎用的な(汎用性に注意することが重要)インタフェースを提供することである.たとえば、反復インタフェースの1つの操作は、データセットの各要素を順次巡回させることです.この操作は容器の内部本部構造に依存して独立して行われた.反復器が有効なのは、コンテナクラスが独自の反復器タイプを提供して「正しいこと」をし、コンテナの内部構造を理解できるようにするためです.
反復器のインタフェースは、通常の
アルゴリズムは、データセットの要素を処理するために使用されます.たとえば、データを検索、ソート、変更、またはその他の目的で使用できます.アルゴリズムは反復器を使用するため、反復器のインタフェースはすべてのタイプのコンテナに共通しているため、1つのアルゴリズムを1回記述するだけで任意のコンテナに使用することができる.これがfind()の位置です
アルゴリズムの拡張性を向上させるためには、アルゴリズムによって呼び出されるいくつかの付属関数を提供する必要がある.汎用アルゴリズムを用いて,非常に特別で複雑なニーズに適応することができる.独自の検索基準や特殊な操作を提供して要素をバインドすることができます.
STLの概念は,データと操作を独立させることである.データはコンテナクラスによって管理され、操作は構成可能なアルゴリズムによって定義されます.反復器はこの2つの要素の間の手がかりです.任意のアルゴリズムとコンテナのインタラクションを可能にします.
ある意味では、STLの概念は、それらをバインドするのではなく、データとアルゴリズムを分離するオブジェクト向けプログラミングの初心に立っている.しかし、このような理由は非常に重要です.原則として、任意の容器を任意のアルゴリズムにバインドすることができ、得られた結果はSTLが非常に拡張可能です.
STLの1つの基準は、任意のデータ型をサポートすることです.標準テンプレートライブラリは、すべての部分が任意のタイプのテンプレートに対応していることを意味します.STLは汎用プログラミングの例である.コンテナとアルゴリズムは任意のタイプとクラスに共通しています.
STLはさらに多くの汎用コンポーネントを提供する.アダプタと関数ボディを使用すると、特定の必要に応じてアルゴリズムとインタフェースを追加、制限、構成できます.
注意findはvectorのメンバーではなく、アルゴリズムに存在し、ヘッダファイル
C++vector条件を満たす要素を削除
ヘッダファイルを含む:
C++vectorで実際に要素を削除するには、コンテナvectorで
1.erase()削除要素関数プロトタイプ:
戻り値:削除された要素(または範囲)の次の要素を指します.(An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.)
c++の中の容器については、iteratorを使って便利に遍歴することができます.しかし、iteratorでvector/mapなどを修正する場合は、気をつけなければなりません.
cplusplusのreferenceでstd::vector::eraseの説明は:Iterators,pointers and references pointing to position(or first)and beyond are invalidated,with all iterators,pointers and references to elements before position(or first)are guaranteed to keep referring to the same elements they were referring to before the call.
以上より,従来のiterポインタは要素を削除すると失効し,その後の挙動は予知できなくなる.vectorの場合、eraseは次のiteratorを返します.そのため、次の方法を使用できます.
インプリメンテーションコード
例1.whileループで要素を検索して削除する
例2.forループですべての要素を削除する
例3.重複要素を削除するには、データの元の順序に従う必要があります.本明細書の最後のコードを参照してください.データの元の順序に従う必要がない場合は、次のことができます.
2.find()は、要素の公式ドキュメントの定義を検索します.
find(STL)は、指定した値を持つ要素の最初の一致する位置を範囲内で見つけます.範囲内で検索する指定した値が最初に表示される場所を決定する入力反復器.等価値を持つ要素が見つからない場合はlastを返します.
firstは、指定した値を範囲内で検索する最初の要素の位置を決定する入力反復器に使用されます.
Lastは、指定した値の最後の要素を範囲内で検索した後の次の要素の位置を決定する入力反復器です.
valが検索する値.
指定された位置から検索を開始する場合は、
検索成功:指定した要素を指す反復器を返す検索に失敗しました:end反復器を返します
STLライブラリではfind()のソースコードは次のとおりです.
findで要素を検索して削除する
もう一つの関数はfind_if関数find_if関数、条件付き検索要素.コンテナ要素タイプがクラスの場合、find関数は使用できません.find_しか使用できません.if関数で実現します.find_if関数はコンテナの要素を順次遍歴し、関数をtrueとする最初の要素の反復器を返す.検索に失敗した場合はend反復器を返します.
3.remove()std::vectorは、特定の値要素のメンバーメソッドを直接削除しません.removeアルゴリズムを使用する必要があります.
remove()は削除後のテール反復器を返し、erase()を呼び出してその後の要素を明示的に削除する必要があります.
最初の特定の値要素のみを削除する場合は、次の手順に従います.
4.コードインスタンス(牛客網練習問題)内容:2行の文字c[],b[]を入力する.このプログラムはc[]の中でb[]と重複する要素をすべて削除し、c[]自体の内部で重複する要素も削除(大文字と小文字をすべて大文字に変換)し、最後に残りの重複しない要素を出力する.
STLには、コンテナ、反復器、アルゴリズムが含まれます.
コンテナは、関連するデータ型を管理するために使用されます.各コンテナにはメリットとデメリットがあり、異なるコンテナはプログラム設計の異なるニーズを反映しています.コンテナ自体は、配列またはチェーンテーブルによって実装されるか、コンテナ内の各要素に特別なキー値があります.
反復器は、データセットの各要素を巡回するために使用されます.これらのデータセットは、コンテナまたはコンテナのサブセットである可能性があります.反復器の主な利点は、任意のタイプの容器にコンパクトで汎用的な(汎用性に注意することが重要)インタフェースを提供することである.たとえば、反復インタフェースの1つの操作は、データセットの各要素を順次巡回させることです.この操作は容器の内部本部構造に依存して独立して行われた.反復器が有効なのは、コンテナクラスが独自の反復器タイプを提供して「正しいこと」をし、コンテナの内部構造を理解できるようにするためです.
反復器のインタフェースは、通常の
にほぼ相当する.反復器をインクリメントするには、++
オペレータを呼び出すだけです.*
オペレータを使用して、反復器が参照するデータ値を取得します.したがって、反復器は、スマートポインタとして機能することができる.アルゴリズムは、データセットの要素を処理するために使用されます.たとえば、データを検索、ソート、変更、またはその他の目的で使用できます.アルゴリズムは反復器を使用するため、反復器のインタフェースはすべてのタイプのコンテナに共通しているため、1つのアルゴリズムを1回記述するだけで任意のコンテナに使用することができる.これがfind()の位置です
アルゴリズムの拡張性を向上させるためには、アルゴリズムによって呼び出されるいくつかの付属関数を提供する必要がある.汎用アルゴリズムを用いて,非常に特別で複雑なニーズに適応することができる.独自の検索基準や特殊な操作を提供して要素をバインドすることができます.
STLの概念は,データと操作を独立させることである.データはコンテナクラスによって管理され、操作は構成可能なアルゴリズムによって定義されます.反復器はこの2つの要素の間の手がかりです.任意のアルゴリズムとコンテナのインタラクションを可能にします.
ある意味では、STLの概念は、それらをバインドするのではなく、データとアルゴリズムを分離するオブジェクト向けプログラミングの初心に立っている.しかし、このような理由は非常に重要です.原則として、任意の容器を任意のアルゴリズムにバインドすることができ、得られた結果はSTLが非常に拡張可能です.
STLの1つの基準は、任意のデータ型をサポートすることです.標準テンプレートライブラリは、すべての部分が任意のタイプのテンプレートに対応していることを意味します.STLは汎用プログラミングの例である.コンテナとアルゴリズムは任意のタイプとクラスに共通しています.
STLはさらに多くの汎用コンポーネントを提供する.アダプタと関数ボディを使用すると、特定の必要に応じてアルゴリズムとインタフェースを追加、制限、構成できます.
注意findはvectorのメンバーではなく、アルゴリズムに存在し、ヘッダファイル
#include
を追加する必要があります.C++vector条件を満たす要素を削除
ヘッダファイルを含む:
#include
#include
#include //
C++vectorで実際に要素を削除するには、コンテナvectorで
std::vector::erase()
メソッドを使用します.C++中std::remove()
は要素を削除しない.容器のsize()
は変化せず、要素の置換にすぎないからだ.1.erase()削除要素関数プロトタイプ:
iterator erase (iterator position);
//削除指定要素iterator erase (iterator first, iterator last);
//削除指定範囲内の要素戻り値:削除された要素(または範囲)の次の要素を指します.(An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.)
c++の中の容器については、iteratorを使って便利に遍歴することができます.しかし、iteratorでvector/mapなどを修正する場合は、気をつけなければなりません.
cplusplusのreferenceでstd::vector::eraseの説明は:Iterators,pointers and references pointing to position(or first)and beyond are invalidated,with all iterators,pointers and references to elements before position(or first)are guaranteed to keep referring to the same elements they were referring to before the call.
以上より,従来のiterポインタは要素を削除すると失効し,その後の挙動は予知できなくなる.vectorの場合、eraseは次のiteratorを返します.そのため、次の方法を使用できます.
#include
#include
using namespace std;
int main()
{
vector<int> a = { 12, 23, 34, 45, 56, 67, 78, 89 };
auto iter = a.begin();
while (iter != a.end())
{
if (*iter > 30)
{
iter = a.erase(iter);// iter
}
else //
{
++iter;
}
}
for (const auto &element : a) {
cout << element << endl;
}
return 0;
}
インプリメンテーションコード
例1.whileループで要素を検索して削除する
#include
using namespace std;
void main(void)
{
vector<int> array;
array.push_back(1);
array.push_back(2);
array.push_back(3);
array.push_back(4);
array.push_back(5);
vector<int>::iterator itr = array.begin();
while (itr != array.end())
{
if (*itr == 3)
{
itr = array.erase(itr);// ,
}
else
{
++itr;
}
}
}
例2.forループですべての要素を削除する
#include
#include
using namespace std;
int main()
{
vector<int> test_vec;
for (int i = 0; i<100;i++)
{
test_vec.push_back(i);
}
for(vector<int>::iterator it = test_vec.begin(); it != test_vec.end(); )
{
cout<<*(it)<<endl;
it = test_vec.erase(it);
}
return 0;
}
例3.重複要素を削除するには、データの元の順序に従う必要があります.本明細書の最後のコードを参照してください.データの元の順序に従う必要がない場合は、次のことができます.
sort(v.begin(),v.end()); //unique
v.erase(unique(v.begin(), v.end()), v.end()); //unique ,
2.find()は、要素の公式ドキュメントの定義を検索します.
find(STL)は、指定した値を持つ要素の最初の一致する位置を範囲内で見つけます.範囲内で検索する指定した値が最初に表示される場所を決定する入力反復器.等価値を持つ要素が見つからない場合はlastを返します.
template InputIterator find(InputIterator first, InputIterator last, const T& val);
firstは、指定した値を範囲内で検索する最初の要素の位置を決定する入力反復器に使用されます.
Lastは、指定した値の最後の要素を範囲内で検索した後の次の要素の位置を決定する入力反復器です.
valが検索する値.
find()
関数:指定した要素をコンテナ内で検索します.この要素は基本データ型でなければなりません.構文:find(arr.begin(), arr.end(), 50);
最初のパラメータはarrayの開始アドレスであり、2番目のパラメータはarrayの終了アドレスであり、3番目のパラメータは検索する必要がある値である.指定された位置から検索を開始する場合は、
find(c.begin()+i+1, c.end(), c[i]);
のうちi
がカスタムシフト量であり、forループと組み合わせて現在の位置から検索を実現することができる検索成功:指定した要素を指す反復器を返す検索に失敗しました:end反復器を返します
STLライブラリではfind()のソースコードは次のとおりです.
template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value)
{
while (first != last && *first != value)
{
++first;
}
++first;
return first;
}
findで要素を検索して削除する
#include
#include
#include
using namespace std;
vector<int> arr(100);// array
int main()
{
arr[20] = 50;// 0
vector<int>::iterator s = find(arr.begin(), arr.end(), 50);// array , array ,
if (s != arr.end())// ,
{
cout << *s << endl;
}
else//
{
cout << "not find!" << endl;
}
system("pause");
return 0;
}
もう一つの関数はfind_if関数find_if関数、条件付き検索要素.コンテナ要素タイプがクラスの場合、find関数は使用できません.find_しか使用できません.if関数で実現します.find_if関数はコンテナの要素を順次遍歴し、関数をtrueとする最初の要素の反復器を返す.検索に失敗した場合はend反復器を返します.
3.remove()std::vectorは、特定の値要素のメンバーメソッドを直接削除しません.removeアルゴリズムを使用する必要があります.
std::vector <Elem> coll;
//remove all elements with value val
coll.erase(remove(coll.begin(), coll.end(), val), coll.end());
remove()は削除後のテール反復器を返し、erase()を呼び出してその後の要素を明示的に削除する必要があります.
最初の特定の値要素のみを削除する場合は、次の手順に従います.
std::vector <Elem> coll;
//remove first element with value val
std::vector<Elem>::iterator pos;
pos = find(coll.begin(), coll.end(), val);
if (pos != coll.end())
{
coll.erase(pos);
}
4.コードインスタンス(牛客網練習問題)内容:2行の文字c[],b[]を入力する.このプログラムはc[]の中でb[]と重複する要素をすべて削除し、c[]自体の内部で重複する要素も削除(大文字と小文字をすべて大文字に変換)し、最後に残りの重複しない要素を出力する.
#include
#include
#include
#include
#include
using namespace std;
int main()
{
vector <char> c;
vector <char> d;
char keyBoard;
// c ,
while (keyBoard = getchar())
{
if (keyBoard == '
')break;
c.push_back(keyBoard);
}
// d ,
while (keyBoard = getchar())
{
if (keyBoard == '
')break;
d.push_back(keyBoard);
}
//c-d:c,d , c d
vector<char>::iterator iter = c.begin();
int i;
for (i = 0; i < d.size(); i++)
{
iter = find(c.begin(), c.end(), d[i]);
if (iter != c.end())
{
c.erase(iter);
}
}
// c ,
for (i = 0; i < c.size(); i++)
{
if (c[i] >= 'a'&&c[i] <= 'z')
{
c[i] -= 32;
}
}
// c
for (i = 0; i < c.size(); i++)
{
iter = find(++(find(c.begin(), c.end(), c[i])), c.end(), c[i]);// ++, , ,
if (iter != c.end())
{
c.erase(iter);
i--;
}
}
// c
for (i = 0; i < c.size(); i++)
{
cout << c[i];
}
return 0;
}