Перегрузка оператора списка C++ STL для пар (сортировка по первому значению, доступ по второму значению)

Здравствуйте, у меня есть несколько сложных операторов перегрузки для std::list.

Я храню пары в списке, состоящем из значения int и массива позиций:

  typedef std::pair< int, std::vector<int,3> > pointPairType;
  typedef std::list< pointPairType > pointListQueueType;
  pointListQueueType pointsQueue;
  // adding some points to the list

И я хотел бы отсортировать список по первому значению пары, я думал, что это сработает:

создание класса сравнения,

и снабдим его коротким алгоритмом:

// comparison function
template < class T1, class T2 >
class compareFirst
{
  public:
  bool operator() (const std::pair<T1,T2>& l, const std::pair<T1,T2>& r)
    {
    return l.first < r.first;
    }
};

... и в основном:

  // use of sorting algorithm : error here
  pointsQueue.sort(< int, std::vector<int,3> >compareFirst);

Но я получаю "ожидаемое первичное выражение перед токеном '‹'

Любая помощь будет принята с благодарностью! Благодарность !


person Antonin    schedule 14.09.2010    source источник


Ответы (1)


Первая проблема заключается в том, что такого типа std::vector<int, 3> не существует. Предполагая, что вы хотели использовать 3-элементные массивы, std::array<int, 3> (или std::tr1::array или boost::array, в зависимости от компилятора) — это то, что вам нужно, или просто std::vector<int>.

Во-вторых, эти int и std::vector<int, 3> являются параметрами шаблона, которые говорят компилятору выбирать между многими возможными compileFirst. Они идут после идентификатора, к которому применяются, а не перед ним.

Следующее компилируется и работает на GCC 4.5.2 и MSVC 2010:

#include <list>
#include <array>
typedef std::pair< int, std::array<int, 3> > pointPairType;
typedef std::list< pointPairType > pointListQueueType;
pointListQueueType pointsQueue;
template < class T1, class T2 >
struct compareFirst
{
    bool operator() (const std::pair<T1,T2>& l, const std::pair<T1,T2>& r) const
    {
        return l.first < r.first;
    }
};
int main()
{
    pointsQueue.sort(compareFirst< int, std::array<int,3> >());
}
person Cubbi    schedule 14.09.2010
comment
большое спасибо за этот очень подробный ответ. Действительно, я слишком быстро написал пример (ошибка std::vector). Спасибо еще раз ! - person Antonin; 15.09.2010