Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
virtuos553
48 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 247
Записей в блоге: 1
#1

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

20.11.2014, 10:34. Просмотров 555. Ответов 15
Метки нет (Все метки)

Есть вектора структур такого типа , нужно отсортировать через qsort эту структуру по точке point2

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

Как положить в вектор структур значение через push_back - C++
есть вот такой вектор vector&lt;struct&lt;Point&gt;&gt; в структуре point , есть координата икс. struct Point { double Point_x; ...

Qsort для массива структур - C++
Да, знаю, что таких тем на форуме уже полно, как и кода, но смысл мне всё равно непонятен. Есть массив таких рёбер: struct edge{ int...

Функция qsort для сортировки массивов структур - C++
В общем есть структура struct User { int id; char nickname; int karma; };

функция qsort при сортировке массива структур - C++
Заголовочный файл: #include &lt;stdio.h&gt; #include &lt;ctype.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; #define...

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется - C++
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

Блочная сортировка структур (Отсортировать массив структур по фамилии) - C++
Подскажите алгоритм блочной сортировки структур на языке С++. Мне нужно отсортировать массив структур по фамилии.

15
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
20.11.2014, 10:40 #2
virtuos553, qsort? Зачем? Используйте std::sort и напишите к нему правильный предикат.
0
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
20.11.2014, 10:40 #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;
}
0
virtuos553
48 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 247
Записей в блоге: 1
20.11.2014, 10:41  [ТС] #4
перепутал, через sort, вот по поводу того как предикат написать я и запутался(
0
Croessmah
Ушел
13770 / 8020 / 924
Регистрация: 27.09.2012
Сообщений: 19,751
Записей в блоге: 3
Завершенные тесты: 1
20.11.2014, 10:42 #5
C++
1
2
3
4
bool pred ( const Mystruct & f , const Mystruct & s )
{
   return f.point2 < s.point2 ;
}
1
virtuos553
48 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 247
Записей в блоге: 1
20.11.2014, 10:47  [ТС] #6
как ее потом в sort вставить? еще смотрел на некоторых сайтах там пишут не булеву функцию а реализуют оператор() , есть разница?
0
CheshireCat
Эксперт С++
2903 / 1252 / 81
Регистрация: 27.05.2008
Сообщений: 3,437
20.11.2014, 10:51 #7
C++
1
std::sort(Struct_vector.begin(), Struct_vector.end(), pred);
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4277 / 2296 / 567
Регистрация: 18.10.2014
Сообщений: 3,911
20.11.2014, 10:56 #8
Цитата Сообщение от Ilot Посмотреть сообщение
C++
1
2
3
int compare (const void * M1, const void * M2) {
  return M1.point2 < M2.point2;
}
Вообще-то 'qsort' требует "трехзначной" функции сравнения. Попытки подсунуть ей некое подобие 'std::less' добром не кончатся.
1
castaway
Эксперт С++
4924 / 3032 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
20.11.2014, 11:07 #9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вообще-то 'qsort' требует "трехзначной" функции сравнения.
Вообще-то нет.
0
virtuos553
48 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 247
Записей в блоге: 1
20.11.2014, 11:43  [ТС] #10
а pred описывать в структуре?

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

Добавлено через 6 минут
Все, спасибо,разобрался
0
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
20.11.2014, 11:57 #11
Цитата Сообщение от castaway Посмотреть сообщение
Вообще-то нет.
Вообще-то да.
0
Croessmah
Ушел
13770 / 8020 / 924
Регистрация: 27.09.2012
Сообщений: 19,751
Записей в блоге: 3
Завершенные тесты: 1
20.11.2014, 12:11 #12
Цитата Сообщение от Ilot Посмотреть сообщение
Вообще-то да.
в каком месте?
http://www.cplusplus.com/reference/cstdlib/qsort/
0
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
20.11.2014, 12:13 #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;
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
7790 / 4830 / 751
Регистрация: 29.11.2010
Сообщений: 13,185
20.11.2014, 16:40 #14
Цитата Сообщение от virtuos553 Посмотреть сообщение
перепутал, через sort, вот по поводу того как предикат написать я и запутался(
Почитайте на досуге
Функторы, предикаты, функциональные адаптеры, лямбда-функции

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Попытки подсунуть ей некое подобие 'std::less' добром не кончатся.
А есть конкретные примеры где это может быть плохо?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4277 / 2296 / 567
Регистрация: 18.10.2014
Сообщений: 3,911
20.11.2014, 20:15 #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 практически сразу начинает выдавать ерунду.
1
20.11.2014, 20:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2014, 20:15
Привет! Вот еще темы с ответами:

Можно ли строку (типа string) отсортировать с помощью qsort? - C++
Как можно строку a (типа string) отсортировать с помощью qsort, или это не возможно? На это ... int compare (const void * a, const...

Qsort() Как отсортировать массив объектов по полю объекта - C++
Здравствуйте! Никак не могу сладить с функцией qsort(). У меня есть класс, и в нем нужно сделать сортировку по ОДНОМУ элементу...

Отсортировать структуру User по заданному полю при помощи qsort - C++
Нужно отсортировать структуру через qsort по полю surname define _CRT_SECURE_NO_WARNINGS #include &lt;stdio.h&gt; #include &lt;iostream&gt; ...

Отсортировать в массиве числа с помощью функции qsort по убыванию дробной части - C++
Помогите, пожалуйста. Дан массив вещественных чисел double arr. Отсортируйте в нем числа с помощью функции qsort() по убыванию дробной...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru