C ++字符串引用不能共存

时间:2019-08-31 09:30:56

标签: c++

一个新手问题,有人可以帮助您了解以下错误消息吗?如果不参考使用void getPath(string cur, ...),它将起作用。或者我们可以不经引用使用for (auto s : parents[cur]) {...},它也可以工作。

为什么两个参考不能共存?错误消息对我来说是神秘的,很容易一次又一次地犯同样的错误。

主函数将调用getPath(endWord, beginWord, parents, path, res);

错误消息是error: binding reference of type 'std::__cxx11::string&' {aka 'std::__cxx11::basic_string<char>&'} to 'const std::__cxx11::basic_string<char>' discards qualifiers

该功能如下所示

//function tries to obtain all paths to beginWord, starting from endWord
void getPath(
    string& cur,
    string& beginWord, 
    unordered_map<string, unordered_set<string>>& parents, 
    vector<string>& path, 
    vector<vector<string>>& res) 
{ 
    if (cur == beginWord) {
        path.push_back(cur);
        reverse(path.begin(), path.end());
        res.push_back(path);

        reverse(path.begin(), path.end());
        path.pop_back();
        return;
    }

    path.push_back(cur);
    for (auto& s : parents[cur]) {
        getPath(s, beginWord, parents, path, res); //Here it cause error message.
    }
    path.pop_back();
}

1 个答案:

答案 0 :(得分:2)

使用AAC。这意味着几乎总是const。

我刚刚发明了这个缩写。我希望它存在并且被广泛使用,但是令我惊讶的是,事实并非如此。现在开始吧!

void getPath(
    const string& cur,
    const string& beginWord, 
    unordered_map<string, unordered_set<string>>& parents, 
    vector<string>& path, 
    vector<vector<string>>& res) 

还有更多方法可以改进这段代码。


parents未被设为const,因为在内部对其应用了[]运算符,并且它需要一个非常量。您可以代替find吗?如果是这样,parents也应该是const


res可能不应该是参数,而应该是一个返回值。不用担心效率,多亏了RVO,它可以很好地工作。


每次反转path看起来很浪费,为什么不先将其反转呢?您将需要push_front而不是push_back,这意味着它可能想成为双端队列而不是向量。


unordered_map<string, unordered_set<string>>最好是unordered_multimap<string, string>


最后,也可以将path用作const的引用。这需要在其中制作副本。要保持接口纯净,这可能不是一个小代价。