2016-06-15 2 views
1

При использовании набора, я хочу передать свою собственную функцию сравнения, которая также принимает параметр. Как это сделать и как передать этот набор в качестве ссылки на другие функции?Как объявить набор 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 с передачей параметра в объект сравнения? И как передать этот набор в качестве ссылки на другие функции, а точнее, какова должна быть подпись функции?

спасибо.

ответ

6

Если вам нужен параметр в компараторе, вам нужно будет использовать объект функции. Что-то вроде линии вашего класса. Я думаю, вам нужно будет сделать оператор вызова функции членом const. Вы бы использовали его примерно так:

std::set<MyObj, Comparator> myObjSet(Comparator(100)); 
+1

В частности, вам нужно будет построить объект сравнения, который вы хотите использовать, и передать его конструктору set. –

+0

Благодарю вас, господин Кул и мистер Клоу. Точность. для меня также это очевидное решение, которое я пробовал, прежде чем ставить этот вопрос, и, поверьте мне, это давало ошибку. После вашего ответа я стал уверенным, что есть еще одна проблема, которую я узнал сегодня утром. Фактически синтаксис моего конструктора компаратора есть: ** Comparator (CompareType pCmpType) **, где CompareType - перечисление. Теперь, когда я создаю набор как ** std :: set myObjSet (Comparator (kCompareType_area)) **, и при вставке ** myObjSet.insert (123) ** он дает ошибку как, _left of ' .insert 'должен иметь класс/struct/union_ – BitKnight

+0

Но когда я создаю заданный объект вроде: ** std :: set myObjSet (Comparator ((CompareType) kCompareType_area)) **, он компилируется просто отлично. И теперь я легко передаю свой набор в качестве ссылки также. Таким образом, решение заключается в явном предоставлении типа данных перечисления при дешифровке набора с помощью объекта-компаратора. Спасибо за помощь :) – BitKnight