При использовании набора, я хочу передать свою собственную функцию сравнения, которая также принимает параметр. Как это сделать и как передать этот набор в качестве ссылки на другие функции?Как объявить набор STL с сопоставлением Объект класса с параметризованным конструктором
Например, у меня есть класс Comparator (с operator()
перегруженным и приватным конструктором по умолчанию), который принимает аргумент в конструкторе, который используется при сравнении. который прекрасно работает с алгоритмами сортировки, как,
sort(myVector.begin(), myVector.end(), Comparator(10));
но как я объявляю набор с этим компаратор объекта с параметром.
Я попробовал эти синтаксических годов,
std::set< MyObj, bool(*)(const MyObj&, const MyObj&)> myObjSet(Compatrator(100));
Теперь, когда я вставляю, как, myObjSet.insert(MyObj(0))
, он дает ошибку как Error: "left of '.insert' must have class/struct/union"
Теперь, когда я объявляю набор, как,
std::set< MyObj, Comparator(int)> myObjSet;
его дает ошибку как функцию возврата функции.
class Comparator
{
int m_cmpParameter;
Comparator();
public:
~Comparator();
Comparator(int pCmpParam):m_cmpParameter(pCmpParam){}
bool operator()(const MyObj& pObjA, const MyObj& pObjB);
};
В моем проекте я имею этот один класс для всех сравнений, необходимых STL контейнеров. Как использовать этот класс Comparator с Set с передачей параметра в объект сравнения? И как передать этот набор в качестве ссылки на другие функции, а точнее, какова должна быть подпись функции?
спасибо.
В частности, вам нужно будет построить объект сравнения, который вы хотите использовать, и передать его конструктору set. –
Благодарю вас, господин Кул и мистер Клоу. Точность. для меня также это очевидное решение, которое я пробовал, прежде чем ставить этот вопрос, и, поверьте мне, это давало ошибку. После вашего ответа я стал уверенным, что есть еще одна проблема, которую я узнал сегодня утром. Фактически синтаксис моего конструктора компаратора есть: ** Comparator (CompareType pCmpType) **, где CompareType - перечисление. Теперь, когда я создаю набор как ** std :: set myObjSet (Comparator (kCompareType_area)) **, и при вставке ** myObjSet.insert (123) ** он дает ошибку как, _left of ' .insert 'должен иметь класс/struct/union_ –
BitKnight
Но когда я создаю заданный объект вроде: ** std :: set myObjSet (Comparator ((CompareType) kCompareType_area)) **, он компилируется просто отлично. И теперь я легко передаю свой набор в качестве ссылки также. Таким образом, решение заключается в явном предоставлении типа данных перечисления при дешифровке набора с помощью объекта-компаратора. Спасибо за помощь :) –
BitKnight