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

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

Войти
Регистрация
Восстановить пароль
 
 
Jaksn
3 / 3 / 0
Регистрация: 26.03.2011
Сообщений: 114
#1

Множества STL - C++

27.11.2011, 21:02. Просмотров 1064. Ответов 18
Метки нет (Все метки)

Подскажите плиз, как удалить из двух множеств STL одинаковые элементы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2011, 21:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Множества STL (C++):

STL, множества - C++
Есть задача: В три газетных киоска поступают газеты из имеющегося списка. Определить, какие газеты не заказали в один из киосков,...

Множества без STL - C++
Решаю задачу: ввести н-ое количество множеств и найти их обьединение. Объединение это новое множество в состав которого входят элементы...

STL Пересечение множества и вектора - C++
Задание представлено так провести синхронизацию, чтобы в vector и map остались только имеющиеся в обоих контейнерах элементы. ...

Как получить доступ к объектам set-множества? (STL) - C++
Помогите, пожалуйста: запихал в контейнер set объекты класса, а как потом получить доступ к определенному полю объекта в контейнере - не...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Сыроежка
Заблокирован
27.11.2011, 21:15 #2
Цитата Сообщение от Jaksn Посмотреть сообщение
Подскажите плиз, как удалить из двух множеств STL одинаковые элементы?
Что-то в голову ничего не приходит, как создать новое множество из одинаковых элементов, используя стандартный алгоритм std::set_intersection, а затем, используя его, удалить все элементы из двух исходных множеств.
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
27.11.2011, 22:07 #3
Вот мое, хотелось бы по лучше решение увидеть.
C++
1
2
3
4
5
6
7
8
9
for (auto i = a.begin(); i != a.end(); ++i)
{
    auto j = b.find(*i);
    if (j != b.end()) {
        a.erase(i);
        b.erase(j);
        i = a.begin();
    }
}
Сыроежка
Заблокирован
27.11.2011, 22:22 #4
Цитата Сообщение от emilen Посмотреть сообщение
Вот мое, хотелось бы по лучше решение увидеть.
C++
1
2
3
4
5
6
7
8
9
for (auto i = a.begin(); i != a.end(); ++i)
{
    auto j = b.find(*i);
    if (j != b.end()) {
        a.erase(i);
        b.erase(j);
        i = a.begin();
    }
}
Я думаю, что любое корректное решение будет лучше вашего, так как, как мне представляется, ваше решение некорректное. Во-первых, вы не определили переменную i. Во-вторых, итератор для множества a после удаления элемента станет не действительным.
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
27.11.2011, 22:56 #5
Сыроежка, решение действительно было некорректно, но только не в том, что вы указали, проверьте если хотите. А вот правильное решение, и вполне нормальное по моему.
Что бы работало без auto можно написать вместо него set<int>::iterator, и конечно можно сделать шаблонным.
C++
1
2
3
4
5
6
7
8
9
queue<int> q;
for (auto i = a.begin(); i != a.end(); ++i)
    if (b.find(*i) != b.end()) q.push(*i);
 
while (!q.empty()) {
    a.erase(a.find(q.front()));
    b.erase(b.find(q.front()));
    q.pop();
}
Сыроежка
Заблокирован
27.11.2011, 23:01 #6
Цитата Сообщение от emilen Посмотреть сообщение
Сыроежка, решение действительно было некорректно, но только не в том, что вы указали, проверьте если хотите. А вот правильное решение, и вполне нормальное по моему.
Что бы работало без auto можно написать вместо него set<int>::iterator, и конечно можно сделать шаблонным.

Спасибо, я посмеялся! "Хоть вы и указали, что мое решение некорректное, но это моя заслуга, а не ваша!" Так, что ли?!

Мне, вот, только не понятно, когда вы ставите спецификатор памяти auto, как компилятор догадывается, какой тип у переменной?!

И, потом, вы догадываетесь, что под множеством в терминах STL имеется в виду контейнер std::set или это вам не ведомо?!
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
27.11.2011, 23:09 #7
Цитата Сообщение от Сыроежка Посмотреть сообщение
Спасибо, я посмеялся! "Хоть вы и указали, что мое решение некорректное, но это моя заслуга, а не ваша!" Так, что ли?!
Я имею ввиду то, что мое решение работает! Но не правильно в некоторых случаях.


Цитата Сообщение от Сыроежка Посмотреть сообщение
Мне, вот, только не понятно, когда вы ставите спецификатор памяти auto, как компилятор догадывается, какой тип у переменной?!
auto - из нового стандарта C++11. Можно было весь код написать на С++11, было бы красивей, но еще не многие знакомы с ним, а тут все достаточно понятно.
Сыроежка
Заблокирован
27.11.2011, 23:13 #8
Цитата Сообщение от emilen Посмотреть сообщение
Я имею ввиду то, что мое решение работает! Но не правильно в некоторых случаях.
Я запомню эту формулировку! Она пригодится при общении с клиентами!

auto - из нового стандарта C++11. Можно было весь код написать на С++11, было бы красивей, но еще не многие знакомы с ним, а тут все достаточно понятно.
Не нравится мне это новвовдение стандарта. Я удивляюсь, как Страуструп его пропустил?!
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
27.11.2011, 23:18 #9
Цитата Сообщение от Сыроежка Посмотреть сообщение
Не нравится мне это новвовдение стандарта. Я удивляюсь, как Страуструп его пропустил?!
Это же супер удобно, вместо того что бы писать например такое:
C++
1
set<template<class T> >::iterator i = a.begin();
Можно написать так:
C++
1
auto i = a.begin();
Сыроежка
Заблокирован
27.11.2011, 23:22 #10
Цитата Сообщение от emilen Посмотреть сообщение
Это же супер удобно, вместо того что бы писать например такое:
C++
1
set<template<class T> >::iterator i = a.begin();
Можно написать так:
C++
1
auto i = a.begin();
Я с вами полностью согласен, что это супер-удобно. Проблема в том, что стандарт прошел через неоднократное изменение семантики auto. Сначала можно быо так объявлять переменные, и они получали тип по умолчанию int. затем стандарт строго-настрого запретил это делать. Теперь снова возвращается к своим баранам, но уже с новым контекстом.

То есть плохо, что имеет место такое непостоянство, так как наступает переходной период, который может длиться несколько лет, когда такой код будет приводить в замешательство программистов.
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
27.11.2011, 23:28 #11
Цитата Сообщение от Сыроежка Посмотреть сообщение
То есть плохо, что имеет место такое непостоянство, так как наступает переходной период, который может длиться несколько лет, когда такой код будет приводить в замешательство программистов.
C++ даже гуру-программистов часто вводит в заблуждения, я узнал это из какой-то из известных книг =).
Сыроежка
Заблокирован
27.11.2011, 23:33 #12
Цитата Сообщение от emilen Посмотреть сообщение
C++ даже гуру-программистов часто вводит в заблуждения, я узнал это из какой-то из известных книг =).
Ну, скажем так, гуру оно не вводит в заблуждение, так как все-таки считается, что гуру отслеживает изменения в стандарте.
На самом деле проблема не с только самими программистами, сколько с компиляторами. Потому что это будет только путать программистов, когда на одном компиляторе эту конструкцию можно использовать, а на другом нет. Более того, проекты могут писаться для разных платформ, и никто не гарантирует, что дял некоторой платформы будет компилятор, удовлетворяющий стандарту, на который можно решиться перейти. Не потому, что он не поддерживает этой конструкции, а потому, что у него может быть много других багов, и поэтому предпочительнее иметь дело со старой версией компилятора. А это усожняет ведение кроссплатформенных проектов.
Jaksn
3 / 3 / 0
Регистрация: 26.03.2011
Сообщений: 114
27.11.2011, 23:35  [ТС] #13
Спасибо, впринципе работает, только если например ввести такие множества:
1,2,3,4,5
1,2,3,8,9
то второе число( в данном случае 2) остается почему то.
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
27.11.2011, 23:42 #14
Jaksn, это неправильное решение, посмотрите весь пост, там правильное есть.
Сыроежка
Заблокирован
27.11.2011, 23:43 #15
Цитата Сообщение от Jaksn Посмотреть сообщение
Спасибо, впринципе работает, только если например ввести такие множества:
1,2,3,4,5
1,2,3,8,9
то второе число( в данном случае 2) остается почему то.
Как я уже писал в самом начале, там имеется ошибка при последовательном переборе итераторов. При удалении элемента итератор в цикле становится некорректным, то есть показывает не на следующий после удаленного элемент.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2011, 23:43
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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