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

set_difference(vector<pair<int,int>>, vector<int>> - C++

Восстановить пароль Регистрация
 
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 586
Завершенные тесты: 2
09.10.2013, 20:23     set_difference(vector<pair<int,int>>, vector<int>> #1
Мне бы провести эту операцию по первому значению pair. Это реально сделать через STL или придется самому написать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
09.10.2013, 20:55     set_difference(vector<pair<int,int>>, vector<int>> #2
Даже если будешь сам писать, как же ты собираешься определить отношения на смешанном множестве pair/int?
vector{pair{1, 0}, pair{1, 1}} - vector{1}} = ???
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 586
Завершенные тесты: 2
09.10.2013, 21:04  [ТС]     set_difference(vector<pair<int,int>>, vector<int>> #3
Цитата Сообщение от Somebody Посмотреть сообщение
vector{pair{1, 0}, pair{1, 1}} - vector{1}} = ???
результатом должен быть пустой вектор
newbie666
Заблокирован
09.10.2013, 21:06     set_difference(vector<pair<int,int>>, vector<int>> #4
что ты хочешь делать этой операцией?
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 586
Завершенные тесты: 2
09.10.2013, 21:15  [ТС]     set_difference(vector<pair<int,int>>, vector<int>> #5
Цитата Сообщение от Somebody Посмотреть сообщение
как же ты собираешься определить отношения на смешанном множестве
попробую "наклепать" ...

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

по поводу set_diff: грубо говоря нужно просмотреть в vec1 все некие значения с вектором vec2, и получается найти разность множеств, удалив при этом нужные элементы из vec1.
newbie666
Заблокирован
09.10.2013, 21:37     set_difference(vector<pair<int,int>>, vector<int>> #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.: выполнять операции, в том числе и сравнивать, с разнотипными элементами нельзя, то есть твой первый пост не прокатит
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
09.10.2013, 21:38     set_difference(vector<pair<int,int>>, vector<int>> #7
Цитата Сообщение от mat_for_c Посмотреть сообщение
результатом должен быть пустой вектор
Если было два равных элемента, а во втором множестве один такой, то один в результате останется. Так что даже если там везде одни int'ы будут, это уже не set_difference
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 586
Завершенные тесты: 2
09.10.2013, 21:47  [ТС]     set_difference(vector<pair<int,int>>, vector<int>> #8
Цитата Сообщение от newbie666 Посмотреть сообщение
учись пока я жив
тогда вопрос: [&] - что обозначает?
newbie666
Заблокирован
09.10.2013, 22:04     set_difference(vector<pair<int,int>>, vector<int>> #9
Цитата Сообщение от mat_for_c Посмотреть сообщение
тогда вопрос: [&] - что обозначает?
[] - это обозначает начало лямбда выражения, а [&] обозначает начало лямбда выражения, внутри которого будет доступ к внешним переменным
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
09.10.2013, 23:31     set_difference(vector<pair<int,int>>, vector<int>> #10
Если вдуг есть boost.range, то
C++
1
boost::set_difference(vectorOfPairs | boost::adaptors::map_keys, vectorOfValues, outputIterator);
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 586
Завершенные тесты: 2
11.10.2013, 01:21  [ТС]     set_difference(vector<pair<int,int>>, vector<int>> #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");
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
11.10.2013, 01:30     set_difference(vector<pair<int,int>>, vector<int>> #12
mat_for_c, так ты пишешь в первый вектор, который хранит pair, а не int.

Добавлено через 3 минуты
+ ты бы затирал значения в vec1 в процессе, в итоге получилось бы непонятно что...
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 586
Завершенные тесты: 2
11.10.2013, 01:37  [ТС]     set_difference(vector<pair<int,int>>, vector<int>> #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());
то все нормально, только надо другой вектор урезать...
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
11.10.2013, 01:50     set_difference(vector<pair<int,int>>, vector<int>> #14
Цитата Сообщение от mat_for_c Посмотреть сообщение
то все нормально, только надо другой вектор урезать...
Это не будет работать правильно.
Вообще я по названию темы смотрел - std::set_difference работает так же, как и из boost, только вот штук наподобее map_keys в std нет...
Можно писать во временный вектор, потом swap. Либо делать как ранее писали с find и erase, но там сложность будет уже не O(n + m), как у set_difference.
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 586
Завершенные тесты: 2
11.10.2013, 02:02  [ТС]     set_difference(vector<pair<int,int>>, vector<int>> #15
Цитата Сообщение от gray_fox Посмотреть сообщение
Можно писать во временный вектор
и как это сделать???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2013, 02:51     set_difference(vector<pair<int,int>>, vector<int>>
Еще ссылки по теме:

C++ Записать числа из файла в двумерный массив или вектор вроде такого vector<vector<int>>
C++ Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>) C++

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
11.10.2013, 02:51     set_difference(vector<pair<int,int>>, vector<int>> #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))
Yandex
Объявления
11.10.2013, 02:51     set_difference(vector<pair<int,int>>, vector<int>>
Ответ Создать тему
Опции темы

Текущее время: 09:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru