Хочу отсортировать массив из массивов 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);
}
Независимо от типа элемента 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
для этого результата быть не может.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Нужно считать N-ное кол-во символов из файлаВопрос стоит в чем: Как узнать длинну строки в файле (когда слова разделены пробелом, то считывается...
Программа должна убирать лишние пробелы, посмотрел в отладчике, программа работает вроде норм, но потом где-то ломается и выдает ошибку, если...
Решил разобраться в трассировке лучейДля начала думаю все это дело реализовать чисто на процессоре, то есть при помощи обычного C++ кода, а затем...