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

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

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

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

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

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

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

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

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

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

по поводу set_diff: грубо говоря нужно просмотреть в vec1 все некие значения с вектором vec2, и получается найти разность множеств, удалив при этом нужные элементы из vec1.
0
Заблокирован
09.10.2013, 21:37 6
учись пока я жив
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
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
09.10.2013, 21:38 7
Цитата Сообщение от mat_for_c Посмотреть сообщение
результатом должен быть пустой вектор
Если было два равных элемента, а во втором множестве один такой, то один в результате останется. Так что даже если там везде одни int'ы будут, это уже не set_difference
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
09.10.2013, 21:47  [ТС] 8
Цитата Сообщение от newbie666 Посмотреть сообщение
учись пока я жив
тогда вопрос: [&] - что обозначает?
0
Заблокирован
09.10.2013, 22:04 9
Цитата Сообщение от mat_for_c Посмотреть сообщение
тогда вопрос: [&] - что обозначает?
[] - это обозначает начало лямбда выражения, а [&] обозначает начало лямбда выражения, внутри которого будет доступ к внешним переменным
1
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
09.10.2013, 23:31 10
Если вдуг есть boost.range, то
C++
1
boost::set_difference(vectorOfPairs | boost::adaptors::map_keys, vectorOfValues, outputIterator);
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
11.10.2013, 01:21  [ТС] 11
Цитата Сообщение от 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!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
11.10.2013, 01:30 12
mat_for_c, так ты пишешь в первый вектор, который хранит pair, а не int.

Добавлено через 3 минуты
+ ты бы затирал значения в vec1 в процессе, в итоге получилось бы непонятно что...
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
11.10.2013, 01:37  [ТС] 13
Цитата Сообщение от 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!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
11.10.2013, 01:50 14
Цитата Сообщение от mat_for_c Посмотреть сообщение
то все нормально, только надо другой вектор урезать...
Это не будет работать правильно.
Вообще я по названию темы смотрел - std::set_difference работает так же, как и из boost, только вот штук наподобее map_keys в std нет...
Можно писать во временный вектор, потом swap. Либо делать как ранее писали с find и erase, но там сложность будет уже не O(n + m), как у set_difference.
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
11.10.2013, 02:02  [ТС] 15
Цитата Сообщение от gray_fox Посмотреть сообщение
Можно писать во временный вектор
и как это сделать???
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
11.10.2013, 02:51 16
Вот с 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
11.10.2013, 02:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2013, 02:51
Помогаю со студенческими работами здесь

Отсортировать 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;...

Как можно увеличить размер вектора, который является элементом вектора 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 .................. где числа...


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

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