0

std:findを使用して、std::list内の要素を取得するための検索関数を作成しようとしています。しかし、私はこの男に関して、検索アルゴリズムの3番目のパラメーターで立ち往生しています。stlリストで要素を検索する方法は?演算子==をかなりオーバーロードしましたが、それでもstd::findでは機能しないようです。

これは私のコードです:

class Node
{
    string word;
    int count;

    public:
        Node(string _word) :word(_word), count(0) {}
        ~Node() {}

        const string& getWord() const{
            return word;
        }
        bool operator == (const Node& other) const {
            return (this->word.compare(other.word) == 0);
        }
};
const Node &getNode(const list<Node> &nodes, const string &word){
    list<Node>::iterator itr;
    itr = find(nodes.begin(), nodes.end(), new Node(word)); <-- no viable overload '='
    return *itr;
}

私は今その問題に夢中になっています、私にいくつかのヒントを提案してください。ありがとう

4

2 に答える 2

1

コードを機能させるには、呼び出しnewからを削除するだけです。sortただし、これによってコードが改善されることはありません。

要素が実際に見つかったかどうかはチェックせず、イテレータを逆参照するだけです。要素が見つからなかった場合、これは未定義の動作です。

さて、これを修正する方法。

  1. この機能は提供しないでください。のユーザーがNodeリストを持っている場合、彼女は完全に自分自身を呼び出すことができるはずstd::sortです。
  2. ラッピングの定型文を書きたくないし、書く必要もありません。std::string単一の引数のコンストラクターがを取得するため、クラスはから変換可能ですstring(ただし、これは参照によって文字列を取得する必要があります)。だからあなたはただ書くことができますstd::find(begin(nodes), end(nodes), "foobar");
  3. コンストラクターを明示的にマークして(変換動作はほとんどの場合必要ありません)、2つのfreeoperator==(const Node&, const std::string&)とを追加することもできoperator==(const std::string&, const Node&)ます。

とにかく。using namespace std;ヘッダーから削除します。

于 2012-04-22T18:31:27.363 に答える
1

あなたには2つの主な問題があります:

  • まず、あなたのfind呼び出しはへのポインタを探していますNodenewメモリを割り当て、ポインタを返します。必要なのは、。なしの正確なテキストnewです。

    itr = find(nodes.begin(), nodes.end(), /*new*/ Node(word));
    

    wordまた、コンストラクターに1つの文字列引数を指定するため、代わりに使用できることに注意してください。これにより、暗黙的に変換されます。ただし、これは通常、良いよりも悪いので、コンストラクターをとして宣言するのが最善explicitです。

    explicit Node(string _word) :word(_word), count(0) {} //need Node("hi")
    

    これにより、将来的に混乱の少ないエラーが発生します。デフォルトでは明示的に固定することをお勧めします。


  • 第二に、あなたの主な問題。関数はを返しますconst string &。イテレータのタイプはlist<Node>::iteratorです。これらは一致しません。

    return *itr; //not const
    

    必要なのはこれです:

    list<Node>::const_iterator itr; //create a constant iterator instead
    

    残りは同じままで、うまくいくはずです(または少なくとも私にとってはうまくいきました)。

于 2012-04-22T18:45:10.557 に答える