C++ 编译错误"required from '_InputIterator std::__find_if(_InputIterator, _InputIterator, _Predicate, s



我正在尝试在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

搜索

相关内容

  • 没有找到相关文章

最新更新