无法分配给mapType :: const_iterator? (“没有运营商=匹配”)

时间:2011-09-23 19:38:44

标签: c++ string stl iterator

typedef map<string,int> mapType;
mapType::const_iterator i;

i = find_if( d.begin(), d.end(), isalnum );

在'='我收到错误:

Error:no operator "=" matches these operands

我知道一旦pred解析为true,find_if会返回一个迭代器,那么交易是什么?

2 个答案:

答案 0 :(得分:1)

std::find_if

的文档

我们只能猜出错误,因为你只提供了一半的问题。

假设d为mapTypeisalnum

的正确版本

问题在于,仿函数正在将对象传递给mapType :: value_type(这是映射和所有容器存储其值的方式)。对于map,value_type实际上是实际实现为std :: pair&lt; Key,Value&gt;的键/值对。因此,您需要使用isalnum()来测试对象的第二部分。

在这里,我将该翻译包含在另一个可以由find_if使用的算子isAlphaNumFromMap中

#include <map>
#include <string>
#include <algorithm>
// Using ctype.h brings the C functions into the global namespace
// If you use cctype instead it brings them into the std namespace
// Note: They may be n both namespaces according to the new standard.
#include <ctype.h> 

typedef std::map<std::string,int> mapType;

struct isAlphaNumFromMap
{
    bool operator()(mapType::value_type const& v) const
    {
        return ::isalnum(v.second);
    }
};
int main()
{
    mapType::const_iterator i;
    mapType                 d;

    i = std::find_if( d.begin(), d.end(), isAlphaNumFromMap() );

}

答案 1 :(得分:0)

如果dmap,则问题在于您尝试使用isalnum

isalnum只有一个int参数,但find_if调用的谓词会收到map::value_type。这些类型不兼容,所以你需要一些能够使find_if适应'isalnum'的东西。比如这个:

#include <cstdlib>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

typedef map<string,int> mapType;

bool is_alnum(mapType::value_type v)
{
    return 0 != isalnum(v.second);
}

int main()
{
    mapType::const_iterator i;

    mapType d;

    i = find_if( d.begin(), d.end(), is_alnum );
}