STL сортировать вопрос - PullRequest
       3

STL сортировать вопрос

4 голосов
/ 10 декабря 2010

У меня есть вектор структур:

vector<Custom> myvec; 

Пользовательская структура:

struct Custom
{
   double key[3];
};

Как отсортировать myvec с помощью клавиши [0]. ключ [1] или ключ [2] с использованием алгоритма сортировки STL?

Ответы [ 4 ]

12 голосов
/ 10 декабря 2010

Напишите пользовательский компаратор:

template <int i> struct CustomComp
{
  bool operator()( const Custom& lhs, const Custom& rhs) const
  {
    return lhs.key[i]<rhs.key[i];
  }
};

, а затем отсортируйте, например, с помощью std::sort(myvec.begin(),myvec.end(),CustomComp<0>()); (сортирует по первой ключевой записи)

Или с более новым компилятором (с c++ 0x лямбда-поддержка):

std::sort(myvec.begin(), myvec.end(),
  []( const Custom& lhs, const Custom& rhs) {return lhs.key[0] < rhs.key[0];}
);
10 голосов
/ 10 декабря 2010

Используя пользовательский компаратор.

struct CustomLess {
    size_t idx;
    CustomLess(size_t i) : idx(i) {}
    bool operator()(Custom const& a, Custom const& b) const {
        return a.key[idx] < b.key[idx];
    }
};

затем

std::sort(myvec.begin(), myvec.end(), CustomLess(1)); // for 1

Примечание: я не использовал шаблон, потому что, хотя использование шаблона позволяет компилятору оптимизировать для этого конкретногоindex, он не позволяет вам выбирать индекс во время выполнения, например, на основе пользовательского ввода, поэтому он менее гибок / не может делать столько же, сколько нетекстовая версия.И как мы все знаем, преждевременная оптимизация - это зло:)

2 голосов
/ 10 декабря 2010

Я не уверен, почему так много опубликованных ответов сосредоточены на функторах. Нет необходимости в функторе с заявленным требованием ОП. Вот 2 не функторных решения:

1: оператор перегрузки <в пользовательском классе </p>

bool Custom::operator< (const Custom& rhs)
{
    return key[0] < rhs.key[0];
}

// can call sort(myvec.begin(), myvec.end());

2: создание пользовательской функции сравнения

template<int i> bool CustomLess(const Custom& lhs, const Custom& rhs)
{
    return lhs.key[i] < rhs.key[i];
}

// can call sort(myvec.begin(), myvec.end(), CustomLess<0>);
0 голосов
/ 10 декабря 2010
bool CompareCustoms(const Custom& lhs, const Custom& rhs)
{
    // Compare criteria here
    return (lhs.key[0] < rhs.key[0]);
}
sort(myvec.begin(), myvec.end(), CompareCustoms);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...