0

ベクトル内のオブジェクトを見つける最良の方法を見つけようとしています。現在、このオブジェクトで検索を使用しようとしています:

class Category
{
public:
  string modeType;
  vector<VideoMode> videoModes;

  Category(){}

  Category(string name) 
  {
     modeType = name;
  }

  friend bool operator== ( const Category &c1, const string &c2 )
  {
     return c1.modeType == c2;
  }

};

これは私の発見です:

vector<Category>::iterator category = find(modes.begin(), modes.end(), Category("Name"));

コンパイルしようとすると、「== に対してタイプ "Category" の左側のオペランドを取る演算子が見つかりません」というエラーが表示されます。アルゴリズム ヘッダーを調べたところ、次の検索コードが見つかりました。

template<class _InIt,
class _Ty> inline
_InIt _Find(_InIt _First, _InIt _Last, const _Ty& _Val)
{   // find first matching _Val
for (; _First != _Last; ++_First)
    if (*_First == _Val)
        break;
return (_First);
}

ここからどこへ行くべきかはよくわかりません。アドバイスをいただければ幸いです。私はC ++をよく知りません:(

4

1 に答える 1

0

aと aoperator==を取るように定義しましたが、定義されていない aを見つけようとしています。この場合、文字列リテラルを渡すだけです。Categorystd::stringCategoryoperator==

find(modes.begin(), modes.end(), "Name")

ただし、等値演算子を変更して別の を取得することをお勧めしCategoryます。同じ型の 2 つのオブジェクトを比較することは論理的です。この方法は、文字列が余分なオーバーロードなしで左側にある場合に機能します。これは、型が から暗黙的に変換可能であるためstd::stringです。また、パブリック メンバー以外にはアクセスしないため、フレンドにしないことをお勧めします。

bool operator==(const Category &lhs, const Category &rhs) {
    return lhs.modeType == rhs.modeType;
}

これを使用すると、そのまま使用std::findできますが、文字列リテラルを渡す場合は機能しません。これは、ユーザー定義の変換を 2 回行ってクラス (std::string次にクラス) に到達する必要があるためですが、実行できるのは 1 つだけです。オーバーロードを抑えて、C++14 が登場した後の最も良い解決策は、新しいリテラル サフィックスを利用することです。

find(modes.begin(), modes.end(), "Name"s)
                                 ^std::string because of the s

今のところ_s、同じことを行う独自の を定義することは常に可能です。個人的には、ユーザーがsor_sを追加して、さらに 2 つのオーバーロードを追加したり、コンストラクターをオーバーロードして、構築可能な型を取得したりすることを好みますstd::string。それは無意味な余分な作業のように感じられ、あいまいさの可能性を高めるだけです.

于 2013-07-11T17:38:14.593 に答える