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

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

Войти
Регистрация
Восстановить пароль
 
mat_for_c
139 / 134 / 29
Регистрация: 26.04.2013
Сообщений: 647
Завершенные тесты: 2
#1

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

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

Мне бы провести эту операцию по первому значению pair. Это реально сделать через STL или придется самому написать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2013, 20:23     set_difference(vector<pair<int,int>>, vector<int>>
Посмотрите здесь:

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

Работа с Vector<int[2]> - C++
Доброго всем времени суток! Есть такой кусок кода: int tmpIntArr; std::vector&lt;int&gt; DataArray; DataArray = new vector&lt;int&gt;;...

Файл в vector<int> - C++
Как более удачно записать файл в вектор. С помощью чего открыт файл не имеет значения. Заранее спасибо.

Запихнуть в vector<int>, char? - C++
Всем доброго времени суток! Вот решил написать программу, которая переводила бы число из десятичной системы счисления в шеснадцатиричную...

Vector<unsigned char> в int - C++
есть vector&lt;unsigned char&gt; размером 4 байта..и мне надо перевести их в 1 число типа int. т.е. типо int command = tempN.data(); но ...

Окончание ввода в vector<int> по '\n' - C++
Как реализовать ввод данных с клавы в vector&lt;int&gt;, так, чтобы ввод оканчивался по нажатию Enter? Мой вариант int main() { int...

Сериализация и десериализация vector'а int'ов - C++
Имею вектор: std::vector&lt;int&gt; mig Нужно очень быстро сохранить его в файл, а потом восстановить из файла, пользуясь тем фактом, что это...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 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
139 / 134 / 29
Регистрация: 26.04.2013
Сообщений: 647
Завершенные тесты: 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
139 / 134 / 29
Регистрация: 26.04.2013
Сообщений: 647
Завершенные тесты: 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
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 1
09.10.2013, 21:38     set_difference(vector<pair<int,int>>, vector<int>> #7
Цитата Сообщение от mat_for_c Посмотреть сообщение
результатом должен быть пустой вектор
Если было два равных элемента, а во втором множестве один такой, то один в результате останется. Так что даже если там везде одни int'ы будут, это уже не set_difference
mat_for_c
139 / 134 / 29
Регистрация: 26.04.2013
Сообщений: 647
Завершенные тесты: 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!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 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
139 / 134 / 29
Регистрация: 26.04.2013
Сообщений: 647
Завершенные тесты: 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!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 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
139 / 134 / 29
Регистрация: 26.04.2013
Сообщений: 647
Завершенные тесты: 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!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 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
139 / 134 / 29
Регистрация: 26.04.2013
Сообщений: 647
Завершенные тесты: 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>>
Еще ссылки по теме:

set<vector<int> >, вывод елементов - C++
Возможно глупый вопрос, но я как-то завис на этом. Как правильно вывести элементы из set&lt;vector&lt;int&gt; &gt;? Пробовал перегрузить оператор...

Что означает конструкция vector<int> v1{ 5 }; ? - C++
Доброй ночи) Что означает данная конструкция? (Гуглю не могу найти инфы) 1) vector&lt;int&gt; v1{ 5 }; 2) vector &lt;vector&lt;int&gt; &gt; v2(n +...

Вектор vector<string> переделать в int - C++
Здравствуйте. Подскажите, а то что то совсем запутался Задача следующая создать вектор string наполнить его элементами 123. С этим я...

vector<int>* v; обращение к конкретному элементу - C++
vector&lt;int&gt; *v; v = new vector&lt;int&gt;(); v-&gt;push_back(6); v-&gt;push_back(6); v-&gt;push_back(6); v-&gt;push_back(6); v-&gt;push_back(6); ...

Перегрузка оператора *= для vector<int> - C++
#include &lt;iostream&gt; #include &lt;vector&gt; const long long base = 1000*1000*1000; std::vector&lt;int&gt; &amp;operator *= (std::vector&lt;int&gt; &amp;a,...


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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 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>>
Ответ Создать тему
Опции темы

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