c++编译错误“需要'_InputIterator std::__find_if(_InputIterator, _InputIterator, _Predicate, std::input_iter

Posted

技术标签:

【中文标题】c++编译错误“需要\'_InputIterator std::__find_if(_InputIterator, _InputIterator, _Predicate, std::input_iterator_tag) ”【英文标题】:c++ compile error "required from '_InputIterator std::__find_if(_InputIterator, _InputIterator, _Predicate, std::input_iterator_tag) "c++编译错误“需要'_InputIterator std::__find_if(_InputIterator, _InputIterator, _Predicate, std::input_iterator_tag) ” 【发布时间】:2018-02-07 07:21:48 【问题描述】:

我正在尝试挑战 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++ 向量中的课程先决条件。

为了解决这个问题,我首先尝试将pair的向量转换为一个向量> 记录从一个点(课程)到另一个节点(课程)的边,并记录一个节点是否是另一个节点的儿子,因此它不是树的根。 我首先尝试找出图中是否有任何环。 然后我使用 BFS 搜索图形并返回节点的访问顺序。

vis map 用于记录在查找图中是否访问过某个节点以查找图中的环。 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;
;

【问题讨论】:

【参考方案1】:

使用std::map::find() 代替std::find()。该地图具有键和值对作为值,您不能直接按值进行搜索。如果提供的话,总是首选使用容器类的成员函数而不是常用算法。

替换所有出现的find(map.begin(), map.end() value) 像:

if (find(globalVis.begin(), globalVis.end(), i) == globalVis.end()) 
    ...

与:

if (globalVis.find(i) == globalVis.end()) 
    ...

Demo

std::find() 可用于查找 (key,value) 对的精确匹配,例如:

if(find(vis.begin(), vis.end(), pair<const int, bool>(nextNode, true))!=vis.end())
    ...

但在您的代码中,您只需测试 key 是否已经在地图中,您只需要通过 key 进行搜索。

【讨论】:

以上是关于c++编译错误“需要'_InputIterator std::__find_if(_InputIterator, _InputIterator, _Predicate, std::input_iter的主要内容,如果未能解决你的问题,请参考以下文章

桥接模式 C++ 代码编译错误

C++ (macOS) 的编译错误

未知原因的编译器错误 (C++)

为啥我在 C++ 阶乘函数中出现编译错误?

[C++] 常见编译运行错误总结

有没有办法在 C++ 编译时限制数据大小并产生编译错误?