Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Удалить повторяющиеся элементы из двух векторов - C++

23.09.2013, 03:46. Просмотров 632. Ответов 1
Метки нет (Все метки)

Доброго времени суток!

Есть два вектора, нужно найти повторяющиеся элементы и удалить их из обоих векторов, оставив только первое вхождение.

Собственно, самостоятельно пришел вот к такому решению (жесть, я понимаю):

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
    vector<Test>::iterator it;
    vector<Test>::iterator it_2;
    
    bool del = false;
 
    int count = 0;
 
    for (it = test_1.begin(); it != test_1.end(); ){
        
        for (it_2 = test_2.begin(); it_2 != test_2.end();){
            
            if ((*it).x == (*it_2).x && (*it).y == (*it_2).y){
                
                ++count;
                if(count == 1){ ++it_2; continue; } //пропускаем первое вхождение
                else {
                it_2 = test_2.erase(it_2);
                del = true;
 
                }
                
            } else { ++it_2; }
            
        }
 
        if(del){
 
            it = test_1.erase(it);
            del = false;
        
        } else { ++it; } 
 
    }
Но оно мне жутко не нравится (оно и понятно), может кто-нибудь подсказать как это можно сделать проще? А то моя дурья башка, не доходит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2013, 03:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удалить повторяющиеся элементы из двух векторов (C++):

Удалить из массива повторяющиеся элементы - C++
Удалить из массива повторяющиеся элементы.жду вашим решений

Удалить повторяющиеся элементы списка - C++
Есть список в виде класса. Нужно удалить повторяющиеся элементы, вернее, чтобы каждого было по одному. (например, вводится 1 2 3 3 4 4, а...

Удалить все повторяющиеся элементы в векторе - C++
доброго времени суток. Столкнулся с проблемой удаления лишних повторов чисел в векторе. Задача состоит в следующем: записать число...

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

Удалить повторяющиеся элементы в отсортированнном массиве - C++
пример такого массива I={0,1,3,3,3,5,6,8,10,10} Т.е. я так понимаю, нужно сдигать все элементы при повторении влево, и записывать в инт...

Скрыть или удалить повторяющиеся элементы массива - C++
Вот сама задача. Даны два массива. Массив А состоит из N элементов , массив В состоит из М элементов. Оба массива отсортировать по не...

1
Dendrit
1 / 1 / 0
Регистрация: 07.09.2013
Сообщений: 6
23.09.2013, 12:01 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <set>
#include <vector>
 
    vector<you_type> v1,v2;
    set<you_type> s1,s2;
 
    for(vector<you_type>::iterator i=v1.begin();i<v1.end();++i)
        s1.insert(*i);
    for(vector<you_type>::iterator i=v2.begin();i<v2.end();++i)
        s1.insert(*i);
    for(vector<you_type>::iterator i=v1.begin();i<v1.end();++i)
    {
        if(s1.find(*i)!=s1.end()) s2.insert(*i);
        if(s2.find(*i)!=s1.end()) v1.erase(i);
    }
    for(vector<you_type>::iterator i=v2.begin();i<v2.end();++i)
    {
        if(s1.find(*i)!=s1.end()) s2.insert(*i);
        if(s2.find(*i)!=s1.end()) v2.erase(i);
    }
Все встреченные элементы добавляются в множество 1, потом мы пробегаем по векторам, когда встречаем эти элементы добавляем их в множество 2, если элемент уже есть в множестве 2, значит первое вхождение было и элемент удаляется.

Добавлено через 49 минут
Извините допустил 2 опечатки в 15 и 20;
if(s2.find(*i)!=s2.end()) v2.erase(i);
Так же, все это можно реализовать еще проще.
C++
1
2
3
4
5
6
7
8
    vector<you_type> v1,v2;
    set<you_type> s1;
    for(vector<you_type>::iterator i=v1.begin();i<v1.end();++i)
        if(s1.find(*i)!=s1.end()) {v1.erase(i);--i;}
        else s1.insert(*i);
    for(vector<you_type>::iterator i=v2.begin();i<v2.end();++i)
        if(s1.find(*i)!=s1.end()) {v2.erase(i);--i;}
        else s1.insert(*i);
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2013, 12:01
Привет! Вот еще темы с ответами:

Как удалить из исходного массива не повторяющиеся элементы? - C++
Вводится длина одномерного массива и значения его элементов. Удалить из исходного массива уникальные (не повторяющиеся) элементы. Результат...

Перевести из C++ в Си: удалить из исходной строки слова-палиндромы, повторяющиеся более двух раз - C++
Утро доброе. Нужна помощь. Перевести данный код в Си. Плюсы знаю хорошо, но проблема с реализацией его в Си, ибо не помню действий со...

Массив. Удалить из исходного массива уникальные (не повторяющиеся) элементы - C++
Вводится длина одномерного массива и значения его элементов. Удалить из исходного массива уникальные (не повторяющиеся) элементы. Результат...

Напомните формулу (убрать или удалить , скрыть, повторяющиеся элементы) - C++
Есть одномерный массив нужно убрать или удалить , скрыть (то что будет проще), повторяющиеся элементы, главное чтобы на экране не...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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