4

セットに格納されているオブジェクトをどのように比較するかについて質問があります。

class A
{
public:  
char * name;
};

Aのオブジェクトをセットで保存しています。私はoperator()(A&ob1、A&ob2)の実装を提供するコンパレータクラスを提供しています。ここでは、ob1.nameとob2.nameを比較し、ob1.nameがob2.nameよりも小さい場合にtrueを返します。

setのfind()を使用してオブジェクトを検索できますか?私はoperator()の実装のみを提供しました。これで十分でしょうか?この場合、find()がどのように機能するかを誰かが説明できますか?

前もって感謝します

4

4 に答える 4

4

setのfind()を使用してオブジェクトを検索できますか?私はoperator()の実装のみを提供しました。これで十分でしょうか?

comparatorはい、クラスのみに実装のみを提供するだけで十分operator ()(A&,A&)です。デフォルトのコンパレータを参照してくださいstd::less<>

この場合、find()がどのように機能するかを誰かが説明できますか?

非常に簡単に言えば、両方の比較が失敗した場合にのみstd::set<T,comparator>::find(k)イテレータを返します。it

  1. false ==コンパレータ(k、* it)
  2. false ==コンパレータ(* it、k)

std::set<>::end()それ以外の場合は...を返します。


数学的な意味で言えば、std::set次の式による弱い順序で平等を定義します。

  a == b  <==>  !(a < b) && !(b < a)
于 2012-09-29T00:45:10.730 に答える
3

で使用される関数は、セットのテンプレートパラメータとして宣言しstd::set::find()たクラスのインスタンスです。Comparator

template < class Key, class Compare = less<Key>,
           class Allocator = allocator<Key> > class set;

具体的には、コンパレータインスタンスはKeyオブジェクトに渡され、最初のインスタンスが2番目のオブジェクトの前にある場合はtrueを返す必要があります。そうです、あなたの実装は大丈夫です。

さて、さらに掘り下げてみましょう。自分を納得させたい場合は、gccの標準ライブラリの実装のソースコードを掘り下げることができます。

  template<typename _Key, typename _Val, typename _KeyOfValue,
           typename _Compare, typename _Alloc>
    typename _Rb_tree<_Key, _Val, _KeyOfValue,
              _Compare, _Alloc>::iterator
    _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
    find(const _Key& __k)
    {
      iterator __j = _M_lower_bound(_M_begin(), _M_end(), __k);
      return (__j == end()
          || _M_impl._M_key_compare(__k, _S_key(__j._M_node))) ? end() : __j;
    }

(指定したクラス_M_key_compareのインスタンスである)が最初のパラメーター(の1つ)として呼び出され、その戻り値がキーであることがわかります。の戻り値は3値式で使用されるため、ブール値である必要があります。_Compare__kKey_S_key(...)_M_key_compare

于 2012-09-28T23:36:09.800 に答える
2

Aのオブジェクトをセットで保存しています。私はoperator()(A&ob1、A&ob2)の実装を提供するコンパレータクラスを提供しています。

それは正しくありません。コンテナーstd::setは、2番目のテンプレート引数で構成されたコンパレーターに従って順序付けられた要素を維持します。順序不変が破られないことを保証するために、コンテナはキーを定数オブジェクトとして格納します。つまり、コンパレータはキーを。で取得する必要がありますconst &

一般に、コンパレータはoperator()const-referenceによって2つの要素を取り、メンバー関数const自体が次のように提供する必要があります。

struct comparator : std::binary_function<A,A,bool> {
   bool operator()( A const& lhs, A const& rhs ) const;
};
于 2012-09-29T02:24:30.263 に答える
1

set.findまたはset.countを使用できます。set::find()は、要素が見つからない場合はset :: end()を返し、要素が見つからない場合は類似カウントはゼロになります。

set<Item*> itemSet;

Item* item = new Item();    

if (itemSet.count(item) == 0)
{
    std::cout<<"not found"
}
//or
if (itemSet.find(item) == itemSet.end())
{
    std::cout<<"not found"
}
于 2012-09-28T23:33:24.700 に答える