Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка структур, Помогите написать qsort 
V
    Опции темы
TupDub
Дата 27.2.2011, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 21.11.2009

Репутация: нет
Всего: нет



Здравствуйте!
Хочу написать сортировку вектора со структурами с помощью qsort.
Получается это
Код

#include <stdio.h>
#include <stdlib.h>
#include <map>
#include <vector>
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cstdlib>

using namespace std;

struct Track
{
  double Chi2;
  char s;
};

vector<Track> tracks;

int compare (Track * arg1, Track * arg2)
{
  if (arg1->Chi2 < arg2->Chi2)
    return -1;
  if (arg1->Chi2== arg2->Chi2)
    return 0;
  if (arg1->Chi2> arg2->Chi2)
    return 1;
}

int main ()
{
  for (int i = 0; i <= 10; i++) {
    double d=rand () % 100;
    Track tr{d,'A'};
    tracks.push_back(tr);
  }
     
  for (int i = 0; i <= 10; i++)
    printf ("%lf ", tracks[i].Chi2);
    printf ("\n");
  
    qsort (Track, tracks.size(), sizeof(Track), (int (*)(const void *, const void *)) compare);
    
    for (int i = 0; i <= 10; i++)
    printf ("%lf ", tracks[i].Chi2);
  
    printf ("\n");
    return 0;
}


Никак не пойму, почему при компиляции выдаёт ошибку:
Код
 main.cpp:43: error: expected primary-expression before ‘,’ token 


Помогите исправить! Спасибо.

PM   Вверх
volatile
Дата 27.2.2011, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



использовать qsort с STL это же не камильфо.

В стл есть свои алгоритмы : sort; stable_sort

вам обязательно нужно qsort использовать с вектором ?
PM MAIL   Вверх
TupDub
Дата 27.2.2011, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 21.11.2009

Репутация: нет
Всего: нет



volatile,  вы не могли бы продемонстрировать использование sort с вектором структур типа моих ?

Добавлено @ 18:27
Упс! ПОлучилось так
Код

// stable_sort example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct track
{
    double Chi2;
    char A;
};
vector<track> Tracks;

bool compare_as_ints (track t1, track t2)
{
    return (t1.Chi2 < t2.Chi2);
}


int main () {
    
//    double mydoubles[] = {3.14, 1.41, 2.72, 4.67, 1.73, 1.32, 1.62, 2.58};

    vector<track>::iterator it;
    
    
//    cout << "using default comparison:";
//    stable_sort (Tracks.begin(), Tracks.end());
//    
//    for (it=myvector.begin(); it!=myvector.end(); ++it)
//        cout << " " << *it;

//    myvector.assign(mydoubles,mydoubles+8);
    for(int i=10; i!=0; --i)
    {
        track T{i,'A'};
        Tracks.push_back(T);
    }
  
    stable_sort (Tracks.begin(), Tracks.end(), compare_as_ints);
    
    for (it=Tracks.begin(); it!=Tracks.end(); ++it)
        cout << " " << (*it).Chi2;

    cout << endl;

  return 0;
}


Но всё равно мне интересно, почему с qsort не работает ?
И ещё компилятор выдаёт предупрежедение
Код

main.cpp:36: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x

Как его убрать ?



Это сообщение отредактировал(а) TupDub - 27.2.2011, 18:29
PM   Вверх
volatile
Дата 27.2.2011, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(TupDub @  27.2.2011,  18:13 Найти цитируемый пост)
вы не могли бы продемонстрировать использование sort


ок.

Для начала напишем функтор сравнения:
Это как-то так.
Код

struct funktor {
   bool operator () ( const Track & arg1, const Track & arg2 ) const
   {
      return arg1.Chi2 < arg2.Chi2;
   }
};


Ну и сортируем наш вектор примерно таким вызовом:
Код

    std::sort(tracks.begin(), tracks.end(), funktor());


Добавлено через 2 минуты и 33 секунды
С функтором, по сравнению с функцией, работает быстрее. Проверено.

Добавлено через 3 минуты и 45 секунд
Цитата(TupDub @  27.2.2011,  18:13 Найти цитируемый пост)
Но всё равно мне интересно, почему с qsort не работает ?


можно и с qsort
Код

   qsort(&tracks.front(), tracks.size(), sizeof(Track), (int (*)(const void *, const void *)) compare);


Добавлено через 7 минут и 9 секунд
Цитата(TupDub @  27.2.2011,  18:13 Найти цитируемый пост)
warning: extended initializer lists only available 


Код

        track T{i,'A'};


Запишите так:

Код

        track T = {i,'A'};

PM MAIL   Вверх
TupDub
Дата 27.2.2011, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 21.11.2009

Репутация: нет
Всего: нет



volatile, Спасибо за помощь!
А почему вы пишите const Track & arg1, а не Track arg1 ?
PM   Вверх
volatile
Дата 27.2.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(TupDub @  27.2.2011,  18:41 Найти цитируемый пост)
А почему вы пишите const Track & arg1, а не Track arg1 ? 


В функции сравнения мы не меняем члены, поэтому по-правилам хорошего тона, нужно использовать конст.
Ну это обычное дела же, в С++.

Добавлено через 2 минуты и 23 секунды
Да и вашем варианте будет копирование структуры, каждый раз для сравнения. Это же потеря производительности.
В моем варианте передается ссылка, что гораздо быстрее
PM MAIL   Вверх
bsa
Дата 27.2.2011, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(volatile @  27.2.2011,  18:47 Найти цитируемый пост)
В функции сравнения мы не меняем члены, поэтому по-правилам хорошего тона, нужно использовать конс


TupDub, volatile хотел сказать, что когда ты указываешь Track arg в качестве параметра функции, то при вызове произойдет копирование указанной структуры. Это операция может быть довольно долгой. Поэтому нужно передавать по ссылке. Но так как ты менять объект не собираешься, то следует указать const. Это как минимум документирует код, а еще дает ряд плюшек, которые сможешь оценить позже.
PM   Вверх
TupDub
Дата 27.2.2011, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 21.11.2009

Репутация: нет
Всего: нет



bsa, volatile,   Спасибо вам за помощь! 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.