Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/41: Рейтинг темы: голосов - 41, средняя оценка - 4.54
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
1

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

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

Author24 — интернет-сервис помощи студентам
Задание в конце главы в книжке: Заполните массив четными числами, а множество — нечетными. С помощью алгоритма 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 );
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2013, 18:51
Ответы с готовыми решениями:

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

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

В матрицу записать 1, если удвоенный элемент первого множества меньше элемента второго множества
Здравствуйте! Не могу понять, где ошибка в коде... Пользователь вводит размер первого множества,...

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

18
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
14.08.2013, 19:05 2
std::set всегда отсортирован, в этом его свойство.
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
14.08.2013, 19:06 3
std::set по определению хранит элементы уже отсортированными.
0
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
14.08.2013, 19:22  [ТС] 4
Все равно так же ошибка Expression: sequence not oredered
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
14.08.2013, 19:32 5
А почему chet+5, а не +4?
1
1 / 1 / 1
Регистрация: 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 );
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
14.08.2013, 21:13 7
Всё нормально с comp вроде. Только тут хватит просто return df > dv.
А вот main должен возвращать int.
0
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
14.08.2013, 21:20  [ТС] 8
Цитата Сообщение от Somebody Посмотреть сообщение
Всё нормально с comp вроде. Только тут хватит просто return df > dv.
А вот main должен возвращать int.
Уже не должен, если df < dv то все работает если > то та же ошибка sequense not ordered
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
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.
0
1 / 1 / 1
Регистрация: 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 если нельзя переопределить тип сортировки ?
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
14.08.2013, 22:01 11
Цитата Сообщение от ArkTaS Посмотреть сообщение
и всегда им отвечают что уже делать это не нужно
Ну, на заборах тоже много чего пишут...
http://www.open-std.org/jtc1/s... /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 - это слияние. Её задача - слить две отсортированных последовательности в одну отсортированную в один проход. Если же сортировка нужна какая-то другая, то тогда варианта лучшего, чем объединить всё в одну кучу и отсортировать, нет.
0
1 / 1 / 1
Регистрация: 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 ! Поэтому не понимаю смысла наличия данного аргумента
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
14.08.2013, 22:20 13
Опять где-то размер на единицу больше у массива?
0
1 / 1 / 1
Регистрация: 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");
}
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
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>());
0
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
14.08.2013, 22:44  [ТС] 16
Somebody, та же ошибка
0
59 / 58 / 7
Регистрация: 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;
}
1
347 / 292 / 37
Регистрация: 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;
  }
2
59 / 58 / 7
Регистрация: 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;
}
0
24.08.2013, 16:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2013, 16:45
Помогаю со студенческими работами здесь

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

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

Удалить из множества А минимальный элемент множества В
Удалить из множества А минимальный элемент множества В. могу удалить из A все елементи B. а...

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru