Сортировка 2-мерного массива c с помощью std :: sort - PullRequest
0 голосов
/ 15 сентября 2018

Не получается отсортировать 2-мерный массив c с помощью std :: sort.Однако я могу отсортировать одномерный массив.Это в случае, когда мне передают массив AC в программе на C ++ и я надеюсь отсортировать его без копирования в std :: array.Может быть, есть какой-нибудь способ превратить его в массив std ::, не копируя его?Это звучит сомнительно, так как любой std :: array будет вызывать деструктор для памяти, которой он не владеет.

Сортировка Одномерный массив в стиле c работает просто отлично:

int len = 5;
auto one_dim_less = [](int a, int b){
  return a < b;
};
int one_dim[] = {4, 0, 3, 1, 2};
std::sort(one_dim, one_dim + len, one_dim_less);

Попыткасортировать двумерный массив стиля c по второму числу не компилируется:

int len = 5;
auto two_dim_less = [](int a[2], int b[2]){
  return a[1] < b[1];
};
int two_dim[][2] = {{1,8}, {2,4}, {3,10}, {4,40}, {5,1}};
std::sort(two_dim, two_dim + len, two_dim_less);

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Может быть, есть какой-то способ превратить его в std::array, не копируя его?

Возможно, не превращаясь в std::array как таковой, но альтернативный подход может быть приведение 2D массивов в стиле C в std::array ссылку только для сортировки.Делая это в соответствии со стандартом, говоря, что представление std::array в памяти, по крайней мере, начинается с его массива в стиле C *, эквивалентного 1016 *.Смотрите здесь под [array.overview§2] :

Массив - это агрегат, который может быть инициализирован списком с N элементами, типы которых могут быть преобразованы в T.

На практике следующее использование reinterpret_cast, скорее всего, безопасно, но учтите, что если в стандарте нет специального исключения для него, формально это будет неопределенное поведение:

#include <algorithm>
#include <array>
#include <iostream>

int main() {
  auto two_dim_less = [](std::array<int, 2>& a, std::array<int, 2>& b) {
      return a[1] < b[1]; };

  int two_dim[][2] = {{1, 8}, {2, 4}, {3, 10}, {4, 40}, {5, 1}};

  std::array<std::array<int, 2>, 5>& arr =
    *reinterpret_cast<std::array<std::array<int, 2>, 5>*>(&two_dim);

  std::sort(arr.begin(), arr.end(), two_dim_less);

  for (int i = 0; i < 5; i++)
    std::cout << two_dim[i][0] << ", " << two_dim[i][1] << '\n';

  return 0;
}

Вывод:

5, 1
2, 4
1, 8
3, 10
4, 40

Что касается использования std::qsort(), учтите, что потенциально медленнее, чем std::sort(), поскольку последний позволяетвставьте сравнения, в то время как первое - нет.

0 голосов
/ 15 сентября 2018

std::sort() требует объектов, которые он использовал для сортировки, чтобы быть MoveAssginable .

Массивы не являются MoveAssginable (и не могут быть назначены вообще).

Попробуйте использовать массив структур или std::pair s.

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