Сортировать векторы по последним элементам - PullRequest
0 голосов
/ 17 сентября 2009

есть "вектор векторов" это выглядит примерно так

3 1 2 0 77
0 3 1 2 44
1 0 3 2 29
3 0 1 2 49

Я бы хотел отсортировать их по последнему элементу в каждой строке, чтобы в конце это выглядело так

1 0 3 2 29 
0 3 1 2 44
3 0 1 2 49
3 1 2 0 77

Конечно, мой реальный пример намного сложнее ... но это в основном то, что мне нужно сделать. Прямо сейчас я использую этот фрагмент, который, кажется, сортирует по первым элементам.

vector<vector<int>>population;
partial_sort( population.begin(),population.begin()+10, population.end() );

Ответы [ 3 ]

7 голосов
/ 17 сентября 2009

Вы можете использовать std :: sort с функцией (или объектом функтора), которая обеспечивает строго слабый порядок векторов. То есть Вы определяете функцию «меньше вектора», которая правильно упорядочивает два вектора, что-то вроде этого (вне головы). Редактировать: после комментариев добавлена ​​проверка на один или два пустых вектора, что усложняет задачу.

bool CustomVectorCompare(const std::vector<int> &i_lhs, const std::vector<int> &i_rhs)
  {
  if(i_rhs.empty())
    return false; // If right side is empty, left can only be equal or larger

  if(i_lhs.empty())
    return true;  // Consider an empty vector to be "smaller" 
                  // than any non-empty vector.       

  return i_lhs.back() < i_rhs.back();
  }

  std::sort(population.begin(), population.end(), CustomVectorCompare);
6 голосов
/ 17 сентября 2009

Используйте простой std :: sort и передайте функтор, который сравнивает только последние элементы вектора.

Partial_sort переставляет элементы в диапазоне [first, last) так, чтобы они были частично в порядке возрастания. В частности, он помещает наименьшие средне-первые элементы, отсортированные в порядке возрастания, в диапазон [first, middle). Оставшиеся последние - средние элементы помещаются в неопределенном порядке в диапазон [middle, last).

2 голосов
/ 17 сентября 2009

Вы можете передать компаратор в качестве четвертого аргумента std::partial_sort или std::sort, поэтому просто напишите объект функции с оператором вызова, принимающим два векторных аргумента, которые сравнивают ваши векторы так, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...