Может быть, есть какой-то способ превратить его в 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()
, поскольку последний позволяетвставьте сравнения, в то время как первое - нет.