Итак, у меня есть назначение, которое имеет эту структуру данных
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 аргумент
Я не уверен, в чем проблема или как решить эту проблему
Вы получаете ошибку, потому что operator () является функцией-членом и поэтому используемая вами функция принимает два параметра, this
и 0xbb77.
Ты можешь использовать set::find
вместо.
Если вы хотите искать, используя разные значения членов класса, вы должны предоставить три конструктора для ZipCode
где каждый из них принимает те же параметры, что и одна из перегрузок operator (). Затем добавьте оператор == (const ZipCode& другой) функции и избавиться от оператора (с).
Я бы напечатал это, но это трудно сделать на iPad
Прежде всего, создание структуры и хранилища для вашей информации а также Функтор с тремя различными видами использования — плохой дизайн. Это слишком запутанно. Я почти думал, что std::set<ZipCode, ZipCode>
был незаконным
Во-вторых, чистым решением вашей проблемы должна быть карта. std::map<int, std::array<char, 4>>
, Универсальные алгоритмы STL ничего не знают о хороших свойствах любой структуры данных в std::set
(обычно красно-черное дерево), поэтому используйте map::find
вместо.