Предикат для сравнения массива char

136
01 декабря 2021, 05:20

Хочу отсортировать массив из массивов char (char[32]). Хочу использовать метод sort из stl. Если передавать только начало и конец массива, то происходит что-то странное и весь массив теряется.

Скорее всего нужно 3 параметром передать предикат для сравнения, но с моей реализацией выдает ошибку

bool mypred(char a[32], char b[32]) {
    int res = strcmp(a, b);
    if (res > 1) {
        return true;
    }
    else {
        return false;
    }
}
sort(begin(mas), end(mas), mypred); 

Не знаю как правильно сделать. Ошибка: C2664 "bool (char [],char [])": невозможно преобразовать аргумент 1 из "_Ty" в "char []"

Код объявления массива:

   template<typename T>
    class Algorithm {
    public:
        virtual void Start() = 0;
    protected:
        int length;
        T* data;
    };
template<>
class QuickSort<char[32]> :public Algorithm<char[32]> {
public:
    QuickSort(int size) {
        this->length = size;
        this->data = new char[size][32];
        for (int i = 0; i < size; i++) {
            char a[32];
            a[0] = (char)((rand() % 33) + 90);
            a[1] = '\0';
            strcpy_s((this->data)[i], a);
        }
    }
    void Start() override {
        cout << "QuickSort " << typeid(*this->data).name() << " для " << this->length << endl;
        sort(this->data[0], this->data[length], mypred);
    }
Answer 1
  • Независимо от типа элемента T, если у вас есть массив T a[length] (или указатель T *a на начало массива из T длины length), который вы хотите отсортировать при помощи std::sort, то правильный вызов std::sort будет иметь вид

    std::sort(a, a + length, ...)
    // эквивалентно
    // std::sort(&a[0], &a[length], ...)
    

    а не

    std::sort(a[0], a[length], ...)
    

    как у вас в коде. Тот вызов, который вы использовали у себя в коде на самом деле пытается сортировать length букв самой первой строки (this->data[0]). Это, очевидно, совсем не то, что вы хотели получить.

  • Последовательности из голых обычных массивов невозможно сортировать через std::sort. Массив не удовлетворяет требованиям, налагаемым на элемент последовательности для std::sort: массивы некопируемы. Вы можете сортировать массив из элементов std::array<char, 32>, но не массив из голых char [32].

    Классический std::qsort такое осилит. Но не std::sort.

  • (Забыв на минутку о предыдущем пункте.) Предикат сравнения для std::sort обязан быть совместимым с константными значениями сортируемых элементов. Несмотря на то, что ваши элементы неконстантны, std::sort внутри себя может захотеть сделать вызов вашего предиката с константным аргументом.

    То есть с формальной точки зрения ваш предикат должен быть объявлен как

    bool mypred(const char a[32], char const b[32])
    // эквивалентно
    // bool mypred(const char *a, char const *b)
    

    или как

    bool mypred(const char (&a)[32], char const (&b)[32])
    
  • Что это за

    if (res > 1)
    

    в предикате? Результат функции strcmp имеет только три состояния: отрицательное число, положительное число или 0. Этот результат можно сравнивать с 0, но никакого осмысленного ветвления по > 1 для этого результата быть не может.

READ ALSO
Реверсия массива

Реверсия массива

такой вопрос:

96
Считывание символов из файла с++

Считывание символов из файла с++

Нужно считать N-ное кол-во символов из файлаВопрос стоит в чем: Как узнать длинну строки в файле (когда слова разделены пробелом, то считывается...

104
Не работает программа C++

Не работает программа C++

Программа должна убирать лишние пробелы, посмотрел в отладчике, программа работает вроде норм, но потом где-то ломается и выдает ошибку, если...

231
Трассиврока лучей и мягкие тени, алгоритм генерации лучей внутри конуса (ray tracing + soft shadows)

Трассиврока лучей и мягкие тени, алгоритм генерации лучей внутри конуса (ray tracing + soft shadows)

Решил разобраться в трассировке лучейДля начала думаю все это дело реализовать чисто на процессоре, то есть при помощи обычного C++ кода, а затем...

141