我正在尝试在leetcode上挑战问题210,但我遇到了一个编译错误,我找不到我的代码有什么问题。
错误发生
required from '_InputIterator std::__find_if(_InputIterator, _InputIterator, _Predicate, std::input_iterator_tag)
[with _InputIterator = std::_Rb_tree_iterator<std::pair<const int, bool> >;
_Predicate = __gnu_cxx::__ops::_Iter_equals_val<const int>]'
我将其复制到IDE并试图运行它后,我仍然找不到问题,因为IDE没有显示哪个行引起编译错误。
问题需要找出一个课程的订购,以完成所有课程,因为这些课程存储在C 配对中。
要解决它,我首先尝试将对向量转换为向量>,该向量从一个点(课程(记录到另一个节点(课程(,并记录一个节点是否是其他节点的儿子不是树的根。我尝试首先找出图表中是否有任何戒指。然后,我使用BFS搜索图形并返回访问的节点顺序。
VIS映射用于记录是否已在搜索中访问了一个节点以在图中查找戒指。GlobalVis Map用于记录是否访问了其他节点的搜索中的节点,因此不需要再次搜索作为启动节点。
请告诉我我的代码的哪一行导致编译错误,以及如何纠正,谢谢。
class Solution {
public:
vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<int> res;
edges = vector<vector<int>>(numCourses,vector<int>());
for(int i=0;i<prerequisites.size();i++){
edges[prerequisites[i].first].push_back(prerequisites[i].second);
isRoot[prerequisites[i].second]=false;
}
for(int i=0;i<numCourses;i++){
if(find(globalVis.begin(),globalVis.end(),i)==globalVis.end()){
globalVis[i]=true;
vis.clear();
vis[i]=true;
if(!checkStartNode(i))
return res;
}
}
for(int i=0;i<numCourses;i++){
if(find(isRoot.begin(),isRoot.end(),i)==isRoot.end()){
toVisit.push(i);
}
}
vis.clear();
BFS(res);
return res;
}
void BFS(vector<int>& res){
while(toVisit.size()>0){
int node = toVisit.top();
vis[node]=true;
toVisit.pop();
res.push_back(node);
for(int i=0;i<edges[node].size();i++){
int nextNode = edges[node][i];
if(find(vis.begin(),vis.end(),nextNode)==vis.end())
toVisit.push(nextNode);
}
}
}
bool checkStartNode(int node){
for(int i=0;i<edges[node].size();i++){
int nextNode = edges[node][i];
if(find(vis.begin(),vis.end(),nextNode)!=vis.end()){
globalVis[nextNode]=true;
if(vis[nextNode]==true)
return false;
else{
vis[nextNode]=true;
if(!checkStartNode(nextNode))
return false;
vis[nextNode]=false;
}
}
else{
vis[nextNode]=true;
if(!checkStartNode(nextNode))
return false;
vis[nextNode]=false;
}
}
}
stack<int> toVisit;
vector<vector<int>> edges;
map<int,bool> isRoot;
map<int,bool> vis;
map<int,bool> globalVis;
};
使用std::map::find()
代替std::find()
。该地图将键和值对作为值的对,您无法直接通过值搜索。而且,总是更喜欢使用容器类的成员函数,而不是使用常见算法(如果提供(。
替换find(map.begin(), map.end() value)
的所有出现都喜欢:
if (find(globalVis.begin(), globalVis.end(), i) == globalVis.end()) {
...
with:
if (globalVis.find(i) == globalVis.end()) {
...
demo
std::find()
可用于查找(键,值(对的精确匹配:
if(find(vis.begin(), vis.end(), pair<const int, bool>(nextNode, true))!=vis.end()){
...
但是,在您的代码中,您只需测试键是否已经在地图中,您只需要通过 key 。