stl — Пользовательский C ++ Predicate и найти, если

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

    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: и пытаюсь найти тот, который имеет конкретный почтовый индекс позже. Я делаю это с помощью 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 \ алгоритма (83): ошибка C2064: термин не оценивается для функции, принимающей 1 аргумент

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

0

Решение

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

Ты можешь использовать set::find вместо.

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

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

0

Другие решения

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

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

0

По вопросам рекламы [email protected]