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

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

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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
27.11.2011, 21:15     Множества STL #2
Цитата Сообщение от Jaksn Посмотреть сообщение
Подскажите плиз, как удалить из двух множеств STL одинаковые элементы?
Что-то в голову ничего не приходит, как создать новое множество из одинаковых элементов, используя стандартный алгоритм std::set_intersection, а затем, используя его, удалить все элементы из двух исходных множеств.
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
27.11.2011, 22:07     Множества STL #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     Множества STL #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     Множества STL #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     Множества STL #6
Цитата Сообщение от emilen Посмотреть сообщение
Сыроежка, решение действительно было некорректно, но только не в том, что вы указали, проверьте если хотите. А вот правильное решение, и вполне нормальное по моему.
Что бы работало без auto можно написать вместо него set<int>::iterator, и конечно можно сделать шаблонным.

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

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

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


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

auto - из нового стандарта C++11. Можно было весь код написать на С++11, было бы красивей, но еще не многие знакомы с ним, а тут все достаточно понятно.
Не нравится мне это новвовдение стандарта. Я удивляюсь, как Страуструп его пропустил?!
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
27.11.2011, 23:18     Множества STL #9
Цитата Сообщение от Сыроежка Посмотреть сообщение
Не нравится мне это новвовдение стандарта. Я удивляюсь, как Страуструп его пропустил?!
Это же супер удобно, вместо того что бы писать например такое:
C++
1
set<template<class T> >::iterator i = a.begin();
Можно написать так:
C++
1
auto i = a.begin();
Сыроежка
Заблокирован
27.11.2011, 23:22     Множества STL #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     Множества STL #11
Цитата Сообщение от Сыроежка Посмотреть сообщение
То есть плохо, что имеет место такое непостоянство, так как наступает переходной период, который может длиться несколько лет, когда такой код будет приводить в замешательство программистов.
C++ даже гуру-программистов часто вводит в заблуждения, я узнал это из какой-то из известных книг =).
Сыроежка
Заблокирован
27.11.2011, 23:33     Множества STL #12
Цитата Сообщение от emilen Посмотреть сообщение
C++ даже гуру-программистов часто вводит в заблуждения, я узнал это из какой-то из известных книг =).
Ну, скажем так, гуру оно не вводит в заблуждение, так как все-таки считается, что гуру отслеживает изменения в стандарте.
На самом деле проблема не с только самими программистами, сколько с компиляторами. Потому что это будет только путать программистов, когда на одном компиляторе эту конструкцию можно использовать, а на другом нет. Более того, проекты могут писаться для разных платформ, и никто не гарантирует, что дял некоторой платформы будет компилятор, удовлетворяющий стандарту, на который можно решиться перейти. Не потому, что он не поддерживает этой конструкции, а потому, что у него может быть много других багов, и поэтому предпочительнее иметь дело со старой версией компилятора. А это усожняет ведение кроссплатформенных проектов.
Jaksn
3 / 3 / 0
Регистрация: 26.03.2011
Сообщений: 114
27.11.2011, 23:35  [ТС]     Множества STL #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     Множества STL #14
Jaksn, это неправильное решение, посмотрите весь пост, там правильное есть.
Сыроежка
Заблокирован
27.11.2011, 23:43     Множества STL #15
Цитата Сообщение от Jaksn Посмотреть сообщение
Спасибо, впринципе работает, только если например ввести такие множества:
1,2,3,4,5
1,2,3,8,9
то второе число( в данном случае 2) остается почему то.
Как я уже писал в самом начале, там имеется ошибка при последовательном переборе итераторов. При удалении элемента итератор в цикле становится некорректным, то есть показывает не на следующий после удаленного элемент.
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
27.11.2011, 23:46     Множества STL #16
Стандартными алгоритмами пользоваться нельзя?
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
33
34
35
36
37
38
#include <set>
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>
#include <iterator>
 
std::ostream &operator<<(std::ostream &stream, const std::set<int> &set) {
  std::copy(set.begin(), set.end(),
    std::ostream_iterator<int>(stream, " "));
  return stream;
}
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
  std::set<int> a, b;
  for (int i = 0; i < 20; ++i) {
    a.insert(rand() % 50);
    b.insert(rand() % 50);
  }
 
  // пересечение нужно только для виду
  std::set<int> intersection;
  std::set_intersection(a.begin(), a.end(), b.begin(), b.end(),
    std::inserter(intersection, intersection.begin()));
 
  std::cout << a << std::endl << b << std::endl << intersection << std::endl;
 
  std::set<int> c, d;
  std::set_difference(a.begin(), a.end(), b.begin(), b.end(),
    std::inserter(c, c.begin()));
  std::set_difference(b.begin(), b.end(), a.begin(), a.end(),
    std::inserter(d, d.begin()));
 
  std::cout << c << std::endl << d << std::endl;
 
  return 0;
}
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
27.11.2011, 23:49     Множества STL #17
lemegeton, ваше решение лучше, спасибо, я не знал.
Сыроежка
Заблокирован
27.11.2011, 23:52     Множества STL #18
Цитата Сообщение от emilen Посмотреть сообщение
lemegeton, ваше решение лучше, спасибо, я не знал.
Так я о таком решении в первом же своем комментарии написал! Что же вы не внимательно читаете.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2011, 23:56     Множества STL
Еще ссылки по теме:

STL - C++
Задача: сторонами треугольников и прямоугольников являются цветные (red, green, blue) lego-палстины с соответствующим количеством узлов....

STL - C++
Подскажите, какие приорететы использования std, если программа работа программы в принципе устраивает, за исключением скорости работы? Есть...

STL - C++
Блин нарорд... я затупил по жоскому.... у меня std::vector, пытаюсь добавить элемент на n-e место: using namecpace std; ...

STL - C++
Задача 2. Во входном файле in.txt расположена таблица, в каждой строке которой хранится &quot;владелец&quot;, &quot;домашнее животное&quot;, &quot;кличка&quot;....

STL - C++
помогите сделать ввод ФИО и возраста через STL .Вот часть моего кода#include &lt;string&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include...


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

Или воспользуйтесь поиском по форуму:
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
27.11.2011, 23:56     Множества STL #19
Сыроежка, я видел, да и понятно то, что нужно удалить из каждого множества их пересечения, но я это никогда не делал с использованием STL, вот и написал свой велосипед .
Yandex
Объявления
27.11.2011, 23:56     Множества STL
Ответ Создать тему
Опции темы

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