C++vector容器find eraseの使用操作:指定された要素を検索して削除します。


コンセプト:容器、ローズマリー、アルゴリズム
STLは、コンテナ、ローズマリー、およびアルゴリズムを含む。
器物
関連するデータの種類を管理するために使用します。各容器にはその優れた欠点があります。異なる容器はプログラム設計の異なる要求を反映しています。容器自体は配列またはチェーンによって実現されるかもしれません。または容器内の各要素には特殊なキーがあります。
サンデー
一つのデータセットを巡回するための各要素。これらのデータセットはおそらくコンテナまたはコンテナのサブセットである。ディケンサの主要な利点は、それらが任意のタイプの容器に小型で汎用的なインターフェースを提供することである。例えば、シーケンスインターフェースの動作は、データセットの各要素を順次巡回させることである。この操作は容器の内部本部構造に依存して独立して行われた。なぜシーケンサが効果的なのかというと、容器類は自分のローズマリーのタイプを提供して「正しいこと」をします。
ディケンサのインターフェースはほとんど普通のポインタに相当します。一つのシーケンサをインクリメントさせるには+を呼び出すだけです。*オペレータを使用すると、データの参照値が次の世代で得られます。したがって、ディケンサはスマートポインタとして機能することができる。
アルゴリズム
データセットの要素を処理するために使用されます。例えば、データの検索、並べ替え、変更、または他の目的があります。アルゴリズムは、ローズマリーを使用しています。したがって、アルゴリズムは、ローズマリーのインターフェースがすべてのタイプの容器に共通しているので、一度に作成するだけで任意の容器に使用できます。ここがfindの位置です。
アルゴリズムのより多くの拡張のために、アルゴリズムで呼び出されたいくつかの付属関数を提供する必要がある。汎用アルゴリズムを用いて非常に特別で複雑な需要に適応することができる。独自の検索基準または特殊な操作で要素をバインディングすることができます。
STLの概念は、データと動作を独立させることである。データはコンテナクラスによって管理され、動作は構成可能なアルゴリズムによって定義される。ローズマリーはこの2つの要素の間の手がかりです。どんなアルゴリズムと容器の相互作用も可能です。
ある意味では、STLの概念は、オブジェクトに向けてプログラムされたものである。STLは、バインディングではなくデータとアルゴリズムを分離する。しかし、このようにする理由は非常に重要である。原則として、どの容器もアルゴリズムと結びつけることができ、結果としてSTLは非常に拡張可能である。
STLの基準の一つは、任意のデータタイプをサポートすることである。標準テンプレートライブラリとは、すべての部分が任意の種類に適応するテンプレートであることを意味する。STLは汎用プログラミングの例である。容器とアルゴリズムは任意のタイプとクラスに共通している。
STLはさらに多くの汎用コンポーネントを提供する。アダプターと関数体を使って、特定の必要に応じてアルゴリズムとインターフェースを補足、制限、構成することができます。
findはvectorのメンバーではなく、アルゴリズムの中に存在します。上のファイルを追加してください。
C++vector条件に該当する要素を削除します。
ヘッダを含むファイル:

#include <iostream>
#include <vector>
#include <algorithm>//         
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フォロワーwed the last element erased by the function cal.This the container end if the operased the last element in the sequence)
c+++の中の容器に対して、私達はiteratorを使って便利な遍歴をすることができます。しかし、私達はiteratorを通じてvector/mapなどを修正する時、注意します。
cplusplusのreferenceでstd:vector::eraseの記述は:
Iterators、pointers and references poingto position、beyond are invalidated、with all iterators、pointers and references to elemens before position(or first)aranted to keep therereement.therererererereement。
元のiterポインタは元素を削除すると失効し、その後の行動が予知できなくなります。
vectorに対して、eraseは次のiteratorに戻りますので、次のような方法が使えます。

#include <iostream>
#include <vector>
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 <vector>
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 <vector>
#include <iostream>
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<class InputIterator, class T> 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<iostream>
#include<algorithm>
#include<vector>
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;
}
その他にもう一つの関数があります。if関数
find_if関数、条件付き検索要素。
容器元素タイプがクラスの場合、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.コードの例(一つの牛客ネットの練習問題)
内容:
二行の文字c[],b[]を入力します。
このプログラムはc[]とb[]の重複した要素を全部削除します。
また、c[]自身の内部に重複している要素も削除します(大文字と小文字はすべて大文字に変換されます)。
最後に残った重複しない要素を出力します。

#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
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; }
補足:C++STL vector容器元素の検索と検索find()find_if()関数の使用
コードを見ましょう

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std; 
void print(const int& temp){
    cout<<temp<<endl;
}
 
int main()
{
    const int ARRAY_SIZE=8;
    int IntArray[ARRAY_SIZE]={1,2,3,4,5,6,7};
    vector<int> myvt;
    vector<int>::iterator location_index;
    for(int i=0;i<8;++i){
        myvt.push_back(IntArray[i]);
    }
    for_each(myvt.begin(),myvt.end(),print);
    location_index=find(myvt.begin(),myvt.end(),2);  //find  
    cout<<"  2    :"<<(location_index-myvt.begin())<<endl;
    location_index=find_if(myvt.begin(),myvt.end(),bind2nd(greater<int>(),5));
    cout<<"     5       :"<<(location_index-myvt.begin())<<endl;
    return 0;
}

以上は個人の経験ですので、参考にしていただければと思います。間違いがあったり、完全に考えていないところがあれば、教えてください。