Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972

set_difference(vector<pair<int,int>>, vector<int>>

09.10.2013, 20:23. Показов 2858. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне бы провести эту операцию по первому значению pair. Это реально сделать через STL или придется самому написать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.10.2013, 20:23
Ответы с готовыми решениями:

Как считать данные в vector<pair<int, pair<int, int>>> arr(m) ?
Здравствуйте! Помогите, как считать данные данные в массив такого типа? vector&lt;pair&lt;int, pair&lt;int, int&gt;&gt;&gt; arr(m) Пытался...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; using...

Как удалить повторяющиеся элементы в vector<pair<int, int>>
Есть вот такой вот вектор: vector&lt;pair&lt;int, int&gt;&gt; a(n); Мне нужно убрать все повторяющиеся элементы именно по первому полю пары. Как...

15
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
09.10.2013, 20:55
Даже если будешь сам писать, как же ты собираешься определить отношения на смешанном множестве pair/int?
vector{pair{1, 0}, pair{1, 1}} - vector{1}} = ???
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
09.10.2013, 21:04  [ТС]
Цитата Сообщение от Somebody Посмотреть сообщение
vector{pair{1, 0}, pair{1, 1}} - vector{1}} = ???
результатом должен быть пустой вектор
0
Заблокирован
09.10.2013, 21:06
что ты хочешь делать этой операцией?
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
09.10.2013, 21:15  [ТС]
Цитата Сообщение от Somebody Посмотреть сообщение
как же ты собираешься определить отношения на смешанном множестве
попробую "наклепать" ...

Добавлено через 5 минут
Цитата Сообщение от newbie666 Посмотреть сообщение
что ты хочешь делать этой операцией?
есть вектор vec1. в нем находятся некие пары. сами пары строятся так: (некое значение, его индекс). сам vec1 будет меняться (через erase), поэтому мне нужны индексы.

по поводу set_diff: грубо говоря нужно просмотреть в vec1 все некие значения с вектором vec2, и получается найти разность множеств, удалив при этом нужные элементы из vec1.
0
Заблокирован
09.10.2013, 21:37
учись пока я жив
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
std::vector<std::pair<int,int>> vec1;  //value, index
vec1.push_back(std::make_pair(4,1));
vec1.push_back(std::make_pair(5,2));
vec1.push_back(std::make_pair(6,3));
 
std::vector<int> vec2;
vec2.push_back(3);
vec2.push_back(6);
vec2.push_back(7);
 
for(auto it=vec2.begin(); it != vec2.end(); it++)
{
    auto found = std::find_if(vec1.begin(),vec1.end(),
        [&](const std::pair<int,int> item){return item.first == *it;});
    if(found != vec1.end())
        vec1.erase(found);
}
В результате пара с первым значением 6 сотрётся из vec1, т.к. она есть в vec2

P.S.: выполнять операции, в том числе и сравнивать, с разнотипными элементами нельзя, то есть твой первый пост не прокатит
1
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
09.10.2013, 21:38
Цитата Сообщение от mat_for_c Посмотреть сообщение
результатом должен быть пустой вектор
Если было два равных элемента, а во втором множестве один такой, то один в результате останется. Так что даже если там везде одни int'ы будут, это уже не set_difference
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
09.10.2013, 21:47  [ТС]
Цитата Сообщение от newbie666 Посмотреть сообщение
учись пока я жив
тогда вопрос: [&] - что обозначает?
0
Заблокирован
09.10.2013, 22:04
Цитата Сообщение от mat_for_c Посмотреть сообщение
тогда вопрос: [&] - что обозначает?
[] - это обозначает начало лямбда выражения, а [&] обозначает начало лямбда выражения, внутри которого будет доступ к внешним переменным
1
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
09.10.2013, 23:31
Если вдуг есть boost.range, то
C++
1
boost::set_difference(vectorOfPairs | boost::adaptors::map_keys, vectorOfValues, outputIterator);
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
11.10.2013, 01:21  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
Если вдуг есть boost.range
что-то не хочет...
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
#include <vector>
#include <utility>
#include <boost/range/algorithm/set_algorithm.hpp>
#include <boost/range/adaptors.hpp>
 
using namespace std;
 
void main() 
{
   vector<pair<int,int>> vec1;  //value, index
   vec1.push_back(make_pair(4,1));
   vec1.push_back(make_pair(5,2));
   vec1.push_back(make_pair(6,3));
 
   vector<int> vec2;
   vec2.push_back(3);
   vec2.push_back(6);
   vec2.push_back(7);
 
   vector<pair<int,int>> res;
   boost::set_difference(vec1 | boost::adaptors::map_keys, vec2, vec1.begin());
 
   system("pause");
}
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
11.10.2013, 01:30
mat_for_c, так ты пишешь в первый вектор, который хранит pair, а не int.

Добавлено через 3 минуты
+ ты бы затирал значения в vec1 в процессе, в итоге получилось бы непонятно что...
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
11.10.2013, 01:37  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
который хранит pair
ну мне и надо этот вектор урезать...

и потом:
C++
1
boost::set_difference(vec1 | boost::adaptors::map_keys, vec2, vec2.begin());
поменял... в итоге в vec2 = [ 4 5 6 ]

Добавлено через 4 минуты
а если
C++
1
boost::set_difference(vec2, vec1| boost::adaptors::map_keys, vec2.begin());
то все нормально, только надо другой вектор урезать...
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
11.10.2013, 01:50
Цитата Сообщение от mat_for_c Посмотреть сообщение
то все нормально, только надо другой вектор урезать...
Это не будет работать правильно.
Вообще я по названию темы смотрел - std::set_difference работает так же, как и из boost, только вот штук наподобее map_keys в std нет...
Можно писать во временный вектор, потом swap. Либо делать как ранее писали с find и erase, но там сложность будет уже не O(n + m), как у set_difference.
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
11.10.2013, 02:02  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
Можно писать во временный вектор
и как это сделать???
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
11.10.2013, 02:51
Вот с find и erase примерно так, O(n*m)
C++
1
2
3
4
5
6
7
vec1.erase(
std::remove_if(
      std::begin(vec1), std::end(vec1)
    , [&] (std::pair<int, int> const& pair) {
           return std::find(std::begin(vec2), std::end(vec2), pair.first) != std::end(vec2);
      } 
    , std::end(vec1)));
Добавлено через 15 минут
Цитата Сообщение от mat_for_c Посмотреть сообщение
и как это сделать???
Как то так, на вскидку
C++
1
2
3
4
5
6
std::vector<std::pair<int, int>> difference;
boost::set_difference(
      vec1
    , vec2 | boost::adaptors::transformed([] (int const value) { return std::make_pair(value, int{}); })
    , std::back_inserter(difference));
std::swap(vec1, difference);
Добавлено через 27 минут

Не по теме:

Вроде бы казалось можно сделать так

C++
1
2
3
4
5
6
std::vector<std::pair<int, int>> difference;
std::set_difference(
      std::begin(vec1), std::end(vec1)
    , std::begin(vec2), std::end(vec2)
    , std::back_inserter(difference)
    , [] (std::pair<int, int> const& pair, int const value) { return pair.first < value; });
но, к сожалению, так нельзя; думаю с бустом то же самое, хотя не проверял...



Добавлено через 5 минут
Кстати, в случае find + erase: учитывая, что последовательность vec2 отсортирована, можно заменить линейный поиск на бинарный (binary_search), тогда сложность упадёт до O(n*log(m))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.10.2013, 02:51
Помогаю со студенческими работами здесь

Применить accumulate к vector<pair<int, int>>
Привет. Как можно применить accumulate к vector&lt;pair&lt;int, int&gt;&gt;?

Отсортировать vector< pair<int, int> > по значению
Всем привет, Так как map по умолчанию сортирует только по ключу, а мне нужно по значению, приходиться писать свой велосипед. Подскажите,...

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt; #include &lt;stdlib.h&gt; #include &lt;fstream&gt;...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...

vector < vector < pair<int,int> > > g
Подскажите как мне считать файл *.txt- 2 7 3 9 6 14 1 7 4 15 3 10 .................. где числа идут парами( (2,7),(3,9),(6,14) ) в...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru