Сортировка массива строк в cpp с использованием std: sort
Я пытаюсь отсортировать массивы (да, не векторы) строк, следуя некоторым предложениям с таких сайтов, как этот . Это код, который я написал до сих пор, но он всегда выводит эту длинную ошибку (которая не дает результатов в Google). Как это исправить?
#include <algorithm>
#include <cstring>
#include <iostream>
//qsort(names, n, 15, (int (*)(const void *, const void *))strcmp);
int main()
{
std::cout << "hi";
char arr[3][6];
strcpy(arr[0], "hello"), strcpy(arr[1], "hillo"), strcpy(arr[2], "hallo");
std::sort(arr, arr + 3, [](char const *lhs,
char const *rhs) { return strcmp(lhs, rhs) < 0; });
//qsort(arr, 3, 20, (int (*)(const void *, const void *))strcmp);
for (int i = 0; i < 3; ++i)
std::cout << arr[i] << '\n';
}
Ответы
Это соответствующая часть сообщения об ошибке:
ошибка: массив должен быть инициализирован с помощью инициализатора в фигурных скобках
К сожалению, это не очень понятно, но не исходит из реализации сортировки. Итак, давайте пересмотрим предварительные условия алгоритма:
std::sortреализуется перестановкой элементов. Таким образом, требуется, чтобы элементы можно было менять местами. Элементы вашего массива - это массивы. Массивы не подлежат замене. Следовательно, массив массивов не подлежит сортировке.
будет ли здесь работать тип "строка"?
Использование std::stringбудет работать. Его можно заменить. Вам даже не понадобится специальная функция сравнения, потому что она даже сопоставима.
что делает массивы неизменяемыми, а другие типы - заменяемыми
Своп дополняется инициализацией (и назначением) перемещения. Правила языка говорят, что массив не может быть инициализирован (и не может быть назначен). Зная это, посмотрите, имеет ли смысл сообщение об ошибке.
Вы не можете отсортировать массив массивов с помощью встроенной функции сортировки. Вы можете перемещаться по массиву строк и сортировать каждую строку (str), используя sort(str.begin(), str.end()).