Не можете присвоить mapType :: const_iterator? («нет оператора = совпадения») - PullRequest
3 голосов
/ 23 сентября 2011
typedef map<string,int> mapType;
mapType::const_iterator i;

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

при '=' я получаю ошибку:

Error:no operator "=" matches these operands

Я знаю, что find_if возвращает итератор, когда pred преобразуется в true, так в чем же дело?

Ответы [ 2 ]

1 голос
/ 23 сентября 2011

Документация для std :: find_if

Мы можем только догадываться об ошибке, поскольку вы предоставили только половину проблемы.

Предполагая, что d равно mapType и правильная версия isalnum

Проблема в том, что функтору передается объект в mapType :: value_type (именно так карта и все контейнеры хранят свое значение). Для карты value_type фактически является парой ключ / значение, фактически реализованной как std :: pair . Поэтому вам нужно получить вторую часть объекта для тестирования с помощью isalnum ().

Здесь я обернул этот перевод внутри другого функтора isAlphaNumFromMap, который может использоваться find_if

#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() );

}
0 голосов
/ 24 сентября 2011

Если d - это map, то проблема в том, что вы пытаетесь использовать 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 );
}
...