Форум программистов, компьютерный форум CyberForum.ru

Отсортировать вектор структур по одной переменной через qsort - C++

Восстановить пароль Регистрация
 
virtuos553
 Аватар для virtuos553
48 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 247
Записей в блоге: 1
20.11.2014, 10:34     Отсортировать вектор структур по одной переменной через qsort #1
Есть вектора структур такого типа , нужно отсортировать через qsort эту структуру по точке point2

C++
1
2
3
4
5
6
7
struct Mystruct
{
double point1;
double point2;
double point3;
}
vector<vector<Mystruct>> Struct_vector;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2014, 10:34     Отсортировать вектор структур по одной переменной через qsort
Посмотрите здесь:

Вектор,состоящий из структур C++
C++ Функция qsort для сортировки массивов структур
вектор структур C++
функция qsort при сортировке массива структур C++
Вектор (не из STL) из структур C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.11.2014, 10:40     Отсортировать вектор структур по одной переменной через qsort #2
virtuos553, qsort? Зачем? Используйте std::sort и напишите к нему правильный предикат.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
20.11.2014, 10:40     Отсортировать вектор структур по одной переменной через qsort #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdlib>     /* qsort */
struct Mystruct {
    double point1;
    double point2;
    double point3;
}
int compare (const void * M1, const void * M2) {
  return M1.point2 < M2.point2;
}
int main () {
  vector<Mystruct> Struct_vector;
  
  Заполение вектора...
  
  qsort (Struct_vector.data(), Struct_vector.size(), sizeof(Mystruct), compare);
 
  return 0;
}
virtuos553
 Аватар для virtuos553
48 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 247
Записей в блоге: 1
20.11.2014, 10:41  [ТС]     Отсортировать вектор структур по одной переменной через qsort #4
перепутал, через sort, вот по поводу того как предикат написать я и запутался(
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
20.11.2014, 10:42     Отсортировать вектор структур по одной переменной через qsort #5
C++
1
2
3
4
bool pred ( const Mystruct & f , const Mystruct & s )
{
   return f.point2 < s.point2 ;
}
virtuos553
 Аватар для virtuos553
48 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 247
Записей в блоге: 1
20.11.2014, 10:47  [ТС]     Отсортировать вектор структур по одной переменной через qsort #6
как ее потом в sort вставить? еще смотрел на некоторых сайтах там пишут не булеву функцию а реализуют оператор() , есть разница?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
20.11.2014, 10:51     Отсортировать вектор структур по одной переменной через qsort #7
C++
1
std::sort(Struct_vector.begin(), Struct_vector.end(), pred);
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2787 / 1433 / 393
Регистрация: 18.10.2014
Сообщений: 2,637
20.11.2014, 10:56     Отсортировать вектор структур по одной переменной через qsort #8
Цитата Сообщение от Ilot Посмотреть сообщение
C++
1
2
3
int compare (const void * M1, const void * M2) {
  return M1.point2 < M2.point2;
}
Вообще-то 'qsort' требует "трехзначной" функции сравнения. Попытки подсунуть ей некое подобие 'std::less' добром не кончатся.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
20.11.2014, 11:07     Отсортировать вектор структур по одной переменной через qsort #9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вообще-то 'qsort' требует "трехзначной" функции сравнения.
Вообще-то нет.
virtuos553
 Аватар для virtuos553
48 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 247
Записей в блоге: 1
20.11.2014, 11:43  [ТС]     Отсортировать вектор структур по одной переменной через qsort #10
а pred описывать в структуре?

Добавлено через 2 минуты
он мне не дает просто так в 3 аргументе pred написать, он его не видит

Добавлено через 6 минут
Все, спасибо,разобрался
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
20.11.2014, 11:57     Отсортировать вектор структур по одной переменной через qsort #11
Цитата Сообщение от castaway Посмотреть сообщение
Вообще-то нет.
Вообще-то да.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
20.11.2014, 12:11     Отсортировать вектор структур по одной переменной через qsort #12
Цитата Сообщение от Ilot Посмотреть сообщение
Вообще-то да.
в каком месте?
http://www.cplusplus.com/reference/cstdlib/qsort/
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
20.11.2014, 12:13     Отсортировать вектор структур по одной переменной через qsort #13
Croessmah, в разделе Parameters есть описание требуемого прототипа для функции и приведен пример:
C++
1
2
3
4
5
6
int compareMyType (const void * a, const void * b)
{
  if ( *(MyType*)a <  *(MyType*)b ) return -1;
  if ( *(MyType*)a == *(MyType*)b ) return 0;
  if ( *(MyType*)a >  *(MyType*)b ) return 1;
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
20.11.2014, 16:40     Отсортировать вектор структур по одной переменной через qsort #14
Цитата Сообщение от virtuos553 Посмотреть сообщение
перепутал, через sort, вот по поводу того как предикат написать я и запутался(
Почитайте на досуге
Функторы, предикаты, функциональные адаптеры, лямбда-функции

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Попытки подсунуть ей некое подобие 'std::less' добром не кончатся.
А есть конкретные примеры где это может быть плохо?
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2787 / 1433 / 393
Регистрация: 18.10.2014
Сообщений: 2,637
20.11.2014, 20:15     Отсортировать вектор структур по одной переменной через qsort #15
Цитата Сообщение от MrGluck Посмотреть сообщение
А есть конкретные примеры где это может быть плохо?
Внешне такой предикат будет "слегка похож" на 'std::greater', т.е. будет намекать на сортировку по убыванию. Но при этом он будет грубо нарушать требования total ordering, т.е. будет страдать от таких очевидных несоответствий, как :

1. 'cmp(a, b) == 0' не эквивалентно 'cmp(b, a) == 0' (т.е. 'a == b' не эквивалентно 'b == a')
2. 'cmp(a, b) > 0' не эквивалентно 'cmp(b, a) < 0' (т.е. 'a > b' не эквивалентно 'b < a')

А дальше - неопределенное поведение. Как оно будет себя проявлять - зависит от реализации, в частности от того, завязывается ли она на симметричность равенства и асимметричность неравенства, определяемых переданным снаружи компаратором. Отдельно реализация может проверять свойства компаратора через assertions, просто ради того, чтобы пользователь не расслаблялся.

Реализация qsort в GCC, похоже, не завязывается на эти симметрии - она исправно сортирует по убыванию и я пока не нашел контрпримера. Реализация же qsort в MSVC практически сразу начинает выдавать ерунду.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2014, 08:51     Отсортировать вектор структур по одной переменной через qsort
Еще ссылки по теме:

C++ Как положить в вектор структур значение через push_back
Qsort для массива структур C++
C++ Сортировка записей класса через функцию qsort

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
21.11.2014, 08:51     Отсортировать вектор структур по одной переменной через qsort #16
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Реализация qsort в GCC, похоже, не завязывается на эти симметрии - она исправно сортирует по убыванию и я пока не нашел контрпримера. Реализация же qsort в MSVC практически сразу начинает выдавать ерунду.
Зачем далеко в лес ходить. Передавайте компаратор хоть less типа хоть greater на выходе получите ерунду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <vector>
int compare_1 (const void * a, const void * b)
{
  if ( *(int*)a <  *(int*)b ) return -1;
  if ( *(int*)a == *(int*)b ) return 0;
  if ( *(int*)a >  *(int*)b ) return 1;
}
int compare_2 (const void * a, const void * b)
{
  return *(int*)a < *(int*)b ;
}
int main () {
  const int N = 10;
  std::vector<int> coll_1(N);
  srand(time(NULL));
  for(int i = 0; i < N; ++i)
    coll_1[i] = rand()%10;
 
  std::vector<int> coll_2(coll_1);
 
  for(int i = 0; i < coll_1.size(); ++i)
    std::cout << coll_1[i] << ' ';
  std::cout << std::endl;
  for(int i = 0; i < coll_2.size(); ++i)
    std::cout << coll_2[i] << ' ';
  std::cout << std::endl;
  std::cout << std::endl;
 
  qsort (coll_1.data(), coll_1.size(), sizeof(int), compare_1);
  qsort (coll_2.data(), coll_2.size(), sizeof(int), compare_2);
 
  for(int i = 0; i < coll_1.size(); ++i)
    std::cout << coll_1[i] << ' ';
  std::cout << std::endl;
  for(int i = 0; i < coll_2.size(); ++i)
    std::cout << coll_2[i] << ' ';
 
  return 0;
}
Yandex
Объявления
21.11.2014, 08:51     Отсортировать вектор структур по одной переменной через qsort
Ответ Создать тему
Опции темы

Текущее время: 06:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru