Пользовательский C ++ Предикат и найти, если

0

Поэтому у меня есть задание, которое имеет эту структуру данных

    struct ZipCode
{
    char s[4];
    int  zip;
    bool operator() (const ZipCode &lhs, const ZipCode &rhs) const
    {return lhs.s[1] < rhs.s[1];}
    bool operator() (const char* st, const int &z) const
    {return st == s && z == zip;}
    bool operator() (const int &z) const
    {return zip == z;}

};

Затем я вставляю массив из них в STL: set и пытаюсь найти тот, у которого есть определенный почтовый индекс позже. Я делаю это, используя find_if, как это

std::set<ZipCode, ZipCode>::iterator itz = find_if(mySet.begin(), mySet.end(),ZipCode()(0xbb77));

Когда я его компилирую, я получаю следующую ошибку:

c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm (83): ошибка C2064: термин не оценивает функцию, принимающую 1 аргумент

Я не уверен, в чем проблема или как решить эту проблему

  • 0
    Вы еще не спрашивали об этой части, но я скажу вам, что st == s не делает то, что вы думаете, что делает в этом выражении: bool operator() (const char* st, const int &z) const {return st == s && z == zip;}
  • 0
    Ух ты, я немного удивлен, что пропустил это. поменял его на strcmp(st,s) хотя он работал, и я немного удивлен, что именно сейчас вы указали на это.
Показать ещё 1 комментарий
Теги:
set
predicate
stl

2 ответа

0

Прежде всего, создание структуры как хранилища для вашей информации, так и функтора с тремя различными видами использования - плохой дизайн. Это слишком запутанно. Я почти думал, что std::set<ZipCode, ZipCode> является незаконным.

Во-вторых, чистое решение вашей проблемы должно быть картой. std::map<int, std::array<char, 4>>. Общие алгоритмы STL ничего не знают о хороших свойствах любой структуры данных в std::set (обычно это красно-черное дерево), поэтому используйте map::find вместо этого.

0

Вы получаете ошибку, потому что operator() является функцией-членом, и поэтому используемая вами использует два параметра: this и 0xbb77.

Вместо этого вы можете использовать set::find.

Если вы хотите выполнить поиск с использованием разных значений членов класса, вы должны указать три конструктора для ZipCode, где каждый из них принимает те же параметры, что и одна из перегрузок operator(). Затем добавьте функцию == (const ZipCode & other) и избавьтесь от оператора() s.

Я бы напечатал его, но это было трудно сделать на iPad

Ещё вопросы

Сообщество Overcoder
Наверх
Меню