一个新手问题,有人可以帮助您了解以下错误消息吗?如果不参考使用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();
}
答案 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
的引用。这需要在其中制作副本。要保持接口纯净,这可能不是一个小代价。