0

我试图编写一个搜索函数来通过起诉 std:find 来获取 std::list 中的一个元素。但是我卡在了查找算法的第三个参数中,关于这家伙如何在 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

要使代码正常工作,只需newsort 调用中删除 。但是,这不会使您的代码变得更好。

您不检查是否确实找到了元素,而只是取消引用迭代器。如果未找到该元素,则这是未定义的行为。

现在,如何解决这个问题。

  1. 不提供此功能。如果用户Node有一个列表,她应该完全可以调用std::sort自己。
  2. 你不想写包装的样板,你也不需要。您的类是可转换的,std::string因为单参数构造函数采用 a string(不过,这应该通过引用采用字符串)。所以你可以写std::find(begin(nodes), end(nodes), "foobar");
  3. 您还可以将构造函数标记为显式(大多数情况下不需要转换行为),然后只需添加两个自由operator==(const Node&, const std::string&)operator==(const std::string&, const Node&).

任何状况之下。using namespace std;从您的标题中删除。

于 2012-04-22T18:31:27.363 回答
1

你有两个主要问题:

  • 首先,您的find电话正在寻找指向 a 的指针Nodenew分配内存并返回一个指针。你想要的是没有new.

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

    另请注意,您可以使用 justword代替,因为您为构造函数提供了一个字符串参数,因此它将被隐式转换。不过,这通常弊大于利,最好将构造函数声明为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 回答