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

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

Войти
Регистрация
Восстановить пароль
 
 
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
#1

Сортировка множества - C++

14.08.2013, 18:51. Просмотров 1347. Ответов 18
Метки нет (Все метки)

Задание в конце главы в книжке: Заполните массив четными числами, а множество — нечетными. С помощью алгоритма merge() объедините эти контейнеры в вектор. Выведите его содержимое, чтобы удостовериться, что слияние прошло успешно. Только вот множество не сортируется, а алгоритм merge требует сортировку. Думаю раз автор книги написал это значит есть какой то выход. Использовать copy не предлагайте.
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
#include <iostream>
#include <string>
#include <algorithm>
#include <set>
#include <functional>
#include <vector>
#pragma warning (disable:4786)
 
bool comp( int df,int dv)
{
    return  (df < dv)? true: false;
}
 
void main()
{
   setlocale( LC_ALL,"Russian" );
   int ne4et[]={1, 3, 5, 7, 9};
   set<int> iset(ne4et, ne4et+sizeof(ne4et)/sizeof(int));
   set<int>:: iterator iterSet;
   int chet[]={2, 4, 6, 8};
   vector<int > ivec(100);
   vector<int >::iterator iterVec;
  //  sort(iset.begin(), iset.end());
 //  sort(ne4et, ne4et+sizeof(ne4et)/sizeof(int));
 
   merge(iset.begin(), iset.end(), chet, chet+5, ivec.begin(), comp );
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2013, 18:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка множества (C++):

Число изъять из множества А, если оно является элементом множества А, но не является элементом множества В - C++
Введено с клавиатуры число изъять из множества А, если оно является элементом множества А, но не является элементом множества В. ...

Множества. Вычислить количество элементов множества Q, связанного c исходными множествами - C++
В общем задание звучит так : Заданы 3 упорядоченных множества F, G и H, представленные файлами f, g и h соответственно. Вычислить...

Квадрат с вершинами из первого множества накрывает все точки второго множества и имеет минимальную площадь - C++
Даны два множества точек на плоскости. Выбрать четыре различных точки первого множества так, чтобы квадрат с вершинами в этих точках...

Множества . Найти разность полученного множества с заданным - C++
Всем доброго времени суток! Необходима ваша помощь. Никак не могу сделать второй пункт задачи.Суть задачи-найти 1)объединение множества...

Множества. Проверка множества на наличие элемента в нем - C++
Во многих задачах сталкиваюсь с одной и той же проблемой: Нужно создать множество элементов, добавлять в него новые элементы и проверять...

Удалить из множества А минимальный элемент множества В - C++
Удалить из множества А минимальный элемент множества В. могу удалить из A все елементи B. а минимальний нет( #include &lt;iostream&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
14.08.2013, 19:05 #2
std::set всегда отсортирован, в этом его свойство.
Somebody
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
14.08.2013, 19:06 #3
std::set по определению хранит элементы уже отсортированными.
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
14.08.2013, 19:22  [ТС] #4
Все равно так же ошибка Expression: sequence not oredered
Somebody
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
14.08.2013, 19:32 #5
А почему chet+5, а не +4?
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
14.08.2013, 20:31  [ТС] #6
Цитата Сообщение от Somebody Посмотреть сообщение
А почему chet+5, а не +4?
Действительно, спасибо) не заметил

Добавлено через 29 минут
Цитата Сообщение от ArkTaS Посмотреть сообщение
Действительно, спасибо) не заметил
Зациклился на тексте ошибки что последовательность не отсортирована и не обратил внимания на диапазон)

Добавлено через 16 минут
А в чем ошибка в функциональном объекте comp что исп. для сравнения ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool comp( int df,int dv)
{
    return  (df > dv)? true: false;
}
 
void main()
{
   setlocale( LC_ALL,"Russian" );
   int ne4et[]={1, 3, 5, 7, 9};
   set<int> iset(ne4et, ne4et+sizeof(ne4et)/sizeof(int));
   set<int>:: iterator iterSet;
   int chet[]={2, 4, 6, 8};
   vector<int > ivec(10);
   vector<int >::iterator iterVec;
 
   sort(ne4et, ne4et+sizeof(ne4et)/sizeof(int));
 
   merge(iset.begin(), iset.end(), chet, chet+sizeof(chet)/sizeof(int), ivec.begin(),comp );
Somebody
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
14.08.2013, 21:13 #7
Всё нормально с comp вроде. Только тут хватит просто return df > dv.
А вот main должен возвращать int.
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
14.08.2013, 21:20  [ТС] #8
Цитата Сообщение от Somebody Посмотреть сообщение
Всё нормально с comp вроде. Только тут хватит просто return df > dv.
А вот main должен возвращать int.
Уже не должен, если df < dv то все работает если > то та же ошибка sequense not ordered
Somebody
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
14.08.2013, 21:49 #9
Цитата Сообщение от ArkTaS Посмотреть сообщение
Уже не должен
???
Цитата Сообщение от ArkTaS Посмотреть сообщение
если df < dv то все работает если > то та же ошибка sequense not ordered
А, ну так set-то тоже должен быть с сортировкой в таком же порядке. Если с этой comp, то типа такого:
C++
1
set<int, bool(*)(int, int)> iset(ne4et, ne4et+sizeof(ne4et)/sizeof(int), comp);
а вообще есть sts::less, std::greater.
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
14.08.2013, 21:57  [ТС] #10
Цитата Сообщение от Somebody Посмотреть сообщение
Сообщение от ArkTaS
Уже не должен
???
Ну очень часто встречаю коментарии подобные твоему про return в main() и всегда им отвечают что уже делать это не нужно

Добавлено через 3 минуты
Цитата Сообщение от Somebody Посмотреть сообщение
а вообще есть sts::less, std::greater.
Не работают они ошибку выдает
include <functional> и using namespace std есть

Добавлено через 1 минуту
Цитата Сообщение от Somebody Посмотреть сообщение
если df < dv то все работает если > то та же ошибка sequense not ordered
А, ну так set-то тоже должен быть с сортировкой в таком же порядке. Если с этой comp, то типа такого:
Какой смысл в функц. объекте в merge если нельзя переопределить тип сортировки ?
Somebody
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
14.08.2013, 22:01 #11
Цитата Сообщение от ArkTaS Посмотреть сообщение
и всегда им отвечают что уже делать это не нужно
Ну, на заборах тоже много чего пишут...
http://www.open-std.org/jtc1/sc22/wg...2012/n3337.pdf
Пункт 3.6.1.2
An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main:
int main() { /* ... */ }
and
int main(int argc, char* argv[]) { /* ... */ }
Добавлено через 2 минуты
Цитата Сообщение от ArkTaS Посмотреть сообщение
Какой смысл в функц. объекте в merge если нельзя переопределить тип сортировки ?
merge - это слияние. Её задача - слить две отсортированных последовательности в одну отсортированную в один проход. Если же сортировка нужна какая-то другая, то тогда варианта лучшего, чем объединить всё в одну кучу и отсортировать, нет.
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
14.08.2013, 22:18  [ТС] #12
Цитата Сообщение от ArkTaS Посмотреть сообщение
Ну очень часто встречаю коментарии подобные твоему про return в main() и всегда им отвечают что уже делать это не нужно

Добавлено через 3 минуты
Не работают они ошибку выдает
include <functional> и using namespace std есть

Добавлено через 1 минуту

Какой смысл в функц. объекте в merge если нельзя переопределить тип сортировки ?
в строке если добавить greater<int>
C++
1
   sort(ne4et, ne4et+sizeof(ne4et)/sizeof(int));
тоже работать не будет фз почему

Добавлено через 4 минуты
Цитата Сообщение от ArkTaS Посмотреть сообщение
в строке если добавить greater<int>
C++
1
   sort(ne4et, ne4et+sizeof(ne4et)/sizeof(int));
тоже работать не будет фз почему
Уже разобрался почему less greater не работали

Добавлено через 8 минут
Цитата Сообщение от Somebody Посмотреть сообщение
merge - это слияние. Её задача - слить две отсортированных последовательности в одну отсортированную в один проход. Если же сортировка нужна какая-то другая, то тогда варианта лучшего, чем объединить всё в одну кучу и отсортировать, нет.
Так он не хочет сортировать ! из 2-х строк 2, 4, 6, 8 и 1, 3, 5, 7, 9 он делает 1 2 3 4 5 6 7 8 9 0 это без указания функц. объекта если указать less то результат тот же, если поменять на greater то снова ошибка: sequence not ordered ! Поэтому не понимаю смысла наличия данного аргумента
Somebody
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
14.08.2013, 22:20 #13
Опять где-то размер на единицу больше у массива?
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
14.08.2013, 22:26  [ТС] #14
Цитата Сообщение от Somebody Посмотреть сообщение
Опять где-то размер на единицу больше у массива?
Нет
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
void main()
{
   setlocale( LC_ALL,"Russian" );
   int ne4et[]={1, 3, 5, 7, 9};
   set<int> iset(ne4et, ne4et+sizeof(ne4et)/sizeof(int));
   set<int>:: iterator iterSet;
   int chet[]={2, 4, 6, 8};
   vector<int > ivec(10);
   vector<int >::iterator iterVec;
 
   cout<<endl;
     for(iterSet=iset.begin() ;iterSet!=iset.end(); iterSet++)  // Выводи множество нечетных чисел
   cout<<*iterSet<<' ';
 
 //  sort(chet, chet+sizeof(ne4et)/sizeof(int), greater<int>());   // Сортируем множество нечетных чисел
 
   cout<<endl;
     for(int i=0; i < sizeof(chet)/sizeof(int); i++)   // Выводим массив четных чисел
   cout << chet[i]<< " ";
 
   merge( chet, chet+sizeof(chet)/sizeof(int), iset.begin(), iset.end(), ivec.begin(), greater<int>());
 
   cout<<endl;
     for(iterVec=ivec.begin() ;iterVec!=ivec.end(); iterVec++) 
   cout<<*iterVec<<' ';
 
   cout<<endl;
 
 
   cout<<endl;
   system("pause");
}
Somebody
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
14.08.2013, 22:35 #15
C++
1
vector<int > ivec(10);
ivec[9] == 0

Добавлено через 2 минуты
C++
1
2
3
4
#include <iterator>
...
vector<int> ivec;
merge(chet, chet+sizeof(chet)/sizeof(int), iset.begin(), iset.end(), back_inserter(ivec), greater<int>());
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2013, 22:35
Привет! Вот еще темы с ответами:

Сформировать два множества, первое содержит все простые числа из данного множества, второе - все составные - C++
Условие задачи следующее:Имеется множество, содержащее натуральные числа из некоторого диапазона. Сформировать два множества, первое из...

Сортировка Шелла. Написал программу, не могу понять, почему сортировка не выполняется - C++
Программа создает динамический массив с рандомным заполнением. Дальше выбор сортировок, пузырьком или сортировка Шелла. Вот она то и не...

Сортировка слиянием. В каком куске кода происходит сортировка и каким именно образом? - C++
Помогите, пожалуйста, разобраться. Подскажите в каком куске кода происходит сортировка и каким именно образом? #include &lt;iostream&gt; ...

Быстрая сортировка (сортировка Хоара) для связных списков - C++
есть у кого готовый алгоритм? или подскажите как реализовать


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.08.2013, 22:35
Ответ Создать тему
Опции темы

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