Russian Qt Forum
Ноябрь 26, 2024, 02:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Сортировка массива qsort  (Прочитано 24769 раз)
chu
Гость
« : Апрель 05, 2013, 09:40 »

Не получается отсортировать массив.
Пишу так:
Код:
#include "widget.h"
#include "ui_widget.h"

#include <stdlib.h>
#include <QDateTime>
#include <QDebug>

static int cmp(const void *a, const void *b)
{
    return strcmp(* (char * const *) a, * (char * const *) b);
}

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QString str;
    char arr[20];
    qsrand(QDateTime::currentMSecsSinceEpoch());
    for(int i=0; i<20; i++)
    {
        arr[i] = qrand()%100 + 1;
        str.append(QString::number(arr[i]) + " ");
    }

    qDebug()<<str;

    qsort(&arr[0], 20, sizeof(char *), cmp);

    str.clear();
    for(int i=0; i<20; i++)
    {
        str.append(QString::number(arr[i]) + " ");
    }
    qDebug()<<str;
}

Widget::~Widget()
{
    delete ui;
}
На строке с qsort приложение вылетает.
Что не так?
Записан
VPS
Гость
« Ответ #1 : Апрель 05, 2013, 09:50 »

А что это за тип: (char * const *) a?
Записан
chu
Гость
« Ответ #2 : Апрель 05, 2013, 09:55 »

А что это за тип: (char * const *) a?
скопировал это из документации к методу qsort
Записан
chu
Гость
« Ответ #3 : Апрель 05, 2013, 10:01 »

Исправил:
Код:
static int cmp(const void *a, const void *b)
{
    return strcmp((const char*) a, (const char*) b);
}
заработало!
vps, спасибо!
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #4 : Апрель 05, 2013, 10:01 »

А что это за тип: (char * const *) a?
Это указатель на константный указатель на char, что непонятно Улыбающийся ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апрель 05, 2013, 10:05 »

Исправил:
Код:
static int cmp(const void *a, const void *b)
{
    return strcmp((const char*) a, (const char*) b);
}
заработало!
У Вас элемент - один char, его и сортируйте
Код
C++ (Qt)
static int cmp(const void *a, const void *b)
{
   char c1 = *(char *) a;
   char c2 = *(char *) b;
   if (c1 < c2) return -1;
   if (c1 > c2) return +1;
   return 0;
}

И здесь так

Код
C++ (Qt)
qsort(&arr[0], 20, sizeof(char), cmp);
 
(без *)
« Последнее редактирование: Апрель 05, 2013, 10:08 от Igors » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #6 : Апрель 05, 2013, 10:09 »

ну тогда уж и не
Код:
qsort(&arr[0], 20, sizeof(char *), cmp);
а
Код:
qsort(&arr[0], 20, sizeof(char), cmp);

а еще лучше
Код:
std::sort(&arr[0],&arr[20]);
P.S опередили
« Последнее редактирование: Апрель 05, 2013, 10:12 от alex312 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апрель 05, 2013, 10:15 »

P.S опередили
Улыбающийся К слову: qsort (из stdlib) часто оказывается заметно шустрее std::sort (qSort).
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Апрель 05, 2013, 10:19 »

И я хочу)

Код
C++ (Qt)
#include <iostream>
#include <algorithm>
#include <random>
#include <iterator>
 
using namespace std;
 
int main()
{
   const int N = 20;
   char arr[N];
 
   std::mt19937 gen;
   std::uniform_int_distribution<int> dist(0, 100);
 
   std::generate(arr, arr+N, std::bind(dist, gen));
 
   std::cout << "before sorting:" << std::endl;
   std::copy(arr, arr+N, std::ostream_iterator<int>(std::cout, " "));
 
   std::cout << std::endl << "after sorting:" << std::endl;
 
   std::sort(arr, arr+N);
   std::copy(arr, arr+N, std::ostream_iterator<int>(std::cout, " "));
 
   return 0;
}
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #9 : Апрель 05, 2013, 10:28 »

И я хочу)
тогда уж так:
Код
C++ (Qt)
#include <iostream>
#include <algorithm>
#include <random>
#include <iterator>
#include <vector>
 
using namespace std;
 
int main()
{
   const int N = 20;
   std::vector<char> arr(N);
 
   std::mt19937 gen;
   std::uniform_int_distribution<int> dist(0, 100);
 
   std::generate(arr.begin(), arr.end(), std::bind(dist, gen));
 
   std::cout << "before sorting:" << std::endl;
   std::copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, " "));
 
   std::cout << std::endl << "after sorting:" << std::endl;
 
   std::sort(arr.begin(), arr.end(),[](char a, char b){return a<b;});
   std::copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, " "));
 
   return 0;
}
 
« Последнее редактирование: Апрель 05, 2013, 15:07 от alex312 » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #10 : Апрель 05, 2013, 10:36 »

И я хочу)
тогда уж так:
Код
#include <iostream>
#include <algorithm>
#include <random>
#include <iterator>
#include <vector>
 
using namespace std;
 
int main()
{
   const int N = 20;
   std::vector<char> arr(N);
 
   std::mt19937 gen;
   std::uniform_int_distribution<int> dist(0, 100);
 
   std::generate(arr.begin(), arr.end(), std::bind(dist, gen));
 
   std::cout << "before sorting:" << std::endl;
   std::copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, " "));
 
   std::cout << std::endl << "after sorting:" << std::endl;
 
   std::sort(arr.begin(), arr.end(),[](char a, char b){return a<b;});
   std::copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, " "));
 
   return 0;
}
 

Аха) Но я бы, наверное vector на std::array<char, N>
и  ещё лямбду на std::less заменил бы)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #11 : Апрель 05, 2013, 10:41 »

Аха) Но я бы, наверное vector на std::array<char, N>
и  ещё лямбду на std::less заменил бы)
c std::array<char, N> согласен, а лямбду надо оставить Улыбающийся (меняем один больше на меньше и получаем обратный порядок)
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #12 : Апрель 05, 2013, 10:49 »

Аха) Но я бы, наверное vector на std::array<char, N>
и  ещё лямбду на std::less заменил бы)
c std::array<char, N> согласен, а лямбду надо оставить Улыбающийся (меняем один больше на меньше и получаем обратный порядок)

Но и это всё фигня, на самом деле)
Без виджита это всё равно работать не будет((
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #13 : Апрель 05, 2013, 11:09 »

Но и это всё фигня, на самом деле)
Без виджита это всё равно работать не будет((
Фигня в том, что мы забыли проинициализировать генератор, например так:
Код
C++ (Qt)
gen.seed(std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()));
« Последнее редактирование: Апрель 05, 2013, 15:07 от alex312 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Апрель 05, 2013, 13:51 »

Код:
    std::copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, " "));
А что если надо напечатать аккуратнее? Напр по 10 чисел в строке и чтобы столбики ровные. Можно ли задействовать этот крутой сынтаксыс - или придется по-народному printf ?
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.189 секунд. Запросов: 24.