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

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

Восстановить пароль Регистрация
 
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
14.08.2013, 18:51     Сортировка множества #1
Задание в конце главы в книжке: Заполните массив четными числами, а множество — нечетными. С помощью алгоритма 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++
C++ Удалить из множества А минимальный элемент множества В
C++ Число изъять из множества А, если оно является элементом множества А, но не является элементом множества В
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
14.08.2013, 19:05     Сортировка множества #2
std::set всегда отсортирован, в этом его свойство.
Somebody
2769 / 1582 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 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
2769 / 1582 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 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
2769 / 1582 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 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
2769 / 1582 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 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
2769 / 1582 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 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
2769 / 1582 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 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
2769 / 1582 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 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>());
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
14.08.2013, 22:44  [ТС]     Сортировка множества #16
Somebody, та же ошибка
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
24.08.2013, 15:37     Сортировка множества #17
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
#pragma warning (disable:4786)
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int arr[]={2, 4, 6, 8, 10};
    int arr1[]={1, 3, 5, 7, 9};
    set<int> iSet(arr1, arr1+5);
    vector<int> iVector(10);
    vector<int>::iterator iter;
    merge(arr, arr+5, iSet.begin(), iSet.end(), iVector.begin());
    iter=iVector.begin();
    while(iter!=iVector.end())
        cout <<*iter++ <<" ";
    cout <<endl;
    system("pause");
    return 0;
}
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.08.2013, 16:02     Сортировка множества #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int _tmain(int argc, _TCHAR* argv[])
  {
  int array [] = { 5, 1, 3, 9, 7 };
  std::set<int> set;
  std::vector<int> vector;
  set.emplace(8);
  set.emplace(4);
  set.emplace(6);
  set.emplace(2);
  std::sort(std::begin(array),std::end(array));
  std::merge(std::begin(set),std::end(set),std::begin(array),std::end(array),std::back_inserter(vector));
  for (auto &x:vector)
    std::cout<<x<<" ";
  std::cout<<std::endl;
    return 0;
  }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2013, 16:45     Сортировка множества
Еще ссылки по теме:

Множества . Найти разность полученного множества с заданным C++
Квадрат с вершинами из первого множества накрывает все точки второго множества и имеет минимальную площадь C++
C++ Сформировать два множества, первое содержит все простые числа из данного множества, второе - все составные

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

Или воспользуйтесь поиском по форуму:
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
24.08.2013, 16:45     Сортировка множества #19
Добавлено через 43 секунды
Цитата Сообщение от Nekto Посмотреть сообщение
std::back_inserter(vector))
точно.)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int _tmain(int argc, _TCHAR* argv[])
{
    int arr[]={2, 4, 6, 8, 10};
    int arr1[]={1, 3, 5, 7, 9};
    set<int> iSet(arr1, arr1+5);
    vector<int> iVector;
    vector<int>::iterator iter;
    merge(arr, arr+5, iSet.begin(), iSet.end(), back_inserter(iVector));
    iter=iVector.begin();
    while(iter!=iVector.end())
        cout <<*iter++ <<" ";
    cout <<endl;
    system("pause");
    return 0;
}
Yandex
Объявления
24.08.2013, 16:45     Сортировка множества
Ответ Создать тему
Опции темы

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