C++std::map値で検索

3576 ワード

STLのテンプレートライブラリのstd::mapはkeyで検索できますが、アプリケーションにValueが現れるのも唯一です.例えば、あなたのValueに保存されているのはGUIDなどです.
keyで検索するにはfindで十分ですvalueで検索するにはfind_を検討しなければなりませんif関数です.
find_ifのSTL定義
template  
InputIterator find_if(InputIterator first, InputIterator last,Predicate pred) 
{ 
       while (first != last && !pred(*first)) ++first; 
       return first; 
}
は、単純に言えば、pred関数がtrueを返すように反復器のfirstからlastの間の最初の反復器ポインタを返す.
だから自分で比較関数を実現しなければなりません
1つの方法は、クラス内にvalue_を提供するクラスを実装することです.typeタイプメンバー変数、実装構造関数、operator()の再ロード--基本的にはこの3つで十分です.次のようになります.
class map_value_finder
{
public:
	map_value_finder(QString &cmp_string):m_s_cmp_string(cmp_string){}
	bool operator ()(const std::map::value_type &pair)
	{
		if ( pair.second.compare(m_s_cmp_string) == 0)
			return true;
		return false;
	}
private:
	const QString &m_s_cmp_string;                    
};
この利点はfind_を呼び出すことです.ifの場合は便利です.例えば、
std::map::iterator iter = m_mapIndexToFileGuid.end();
iter = std::find_if(m_mapIndexToFileGuid.begin(), m_mapIndexToFileGuid.end(), map_value_finder(task->pFileInfo->fileID));

map_を作成value_finderの一時オブジェクトは、そのオブジェクトのoperator()を直接呼び出せばよい.
または
value_を検索するために使用される個別の関数type
QString strGlobal = "D";
bool TestFindValue(const std::map::value_type &pair)
{
       if(pair.second.compare(strGlobal) == 0)
	  return true;
	return false;
}
コール:
std::map::iterator iter = std::find_if(map_Test.begin(), map_Test.end(), TestFindValue);
は、直接関数アドレスに入力すればよい.
この使い方は煩雑で、valueを自分で保存する必要があります.
個人は第1種に傾き、ネット上の多くの資源も提供されている第1種である.
また、std::map挿入の2つの方法の比較:
1.insert: map.insert(std::makepair(key,value));
2. map[key]=value;
違い:
1つ目はmapを遍歴し、keyが見つからない場合は挿入し、そうでない場合は挿入しません.
第2の方法では、見つからない場合は挿入し、そうでない場合は対応するkeyアイテムの値をvalueに割り当てます.
2つ目の方法がどんなによくても、見つからないと挿入して、1つ目よりずっと頼りになると思います.2つ目の方法は確かに頼りになりますが、1つ目の方法よりも代価が大きくなります.この頼りになるには時間がかかります.
特にvalueが対象の場合は、よく考えなければなりません.
2つ目の方法は、システムがデフォルトでオブジェクトを構築してから値を割り当て、最後に破棄する(3つの部分時間)ことに相当します.オブジェクトに希望のvalueを割り当てると、デフォルトでオブジェクトを構築してから値を割り当てるよりも効率的です.これがinsertです.
オブジェクト内のプロパティが多い場合は、さらに考慮する必要があります.
具体的なinsertの戻り値は、挿入が成功したかどうかなど、さらに詳しく知ることができます.
single element (1) pair insert (const value_type& val);

The single element versions (1) return a  pair
, with its member 
pair::first
 set to an iterator pointing to either the newly inserted element or to the element with an equivalent key in the  map
. The 
pair::second
 element in the  pair
 is set to 
true
 if a new element was inserted or 
false
 if an equivalent key already existed.
戻り値はpairで、pairは反復器を構成し、bool変数であり、bool変数は挿入に成功したかどうかを識別し、iteratorは挿入に成功したmap要素を指す.
  mymap.insert ( std::pair('a',100) );
  mymap.insert ( std::pair('z',200) );

  std::pair<:map>::iterator,bool> ret;
  ret = mymap.insert ( std::pair('z',500) );
  if (ret.second==false) {
    std::cout << "element 'z' already existed";
    std::cout << " with a value of " << ret.first->second << '
'; }