Один вкладыш для вставки определенного значения объекта класса - PullRequest
0 голосов
/ 25 сентября 2018

Предположим, у меня есть vector<int> myVec;, и я хочу преобразовать его в набор, у меня может быть один вкладыш -

set<int> mySet(myVec.begin(), myVec.end());

Это то, что можно легко найти.

Теперь у меня есть vector<pair<int, int>>, и я хочу получить набор вторых значений в каждой из пар.Как мне использовать конструктор множеств для достижения этой цели?Возможно ли это?

Предполагая, что у меня есть C ++ 11, C ++ 14, C ++ 17.

Кроме того, я был бы признателен, если бы я мог получить некоторую информацию о том, как сделать подобноетвики в общем смысле для разных контейнеров.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Этот почти однострочный лайнер должен работать для вас:

#include <algorithm>
#include <iterator>
#include <iostream>
#include <set>
#include <utility>
#include <vector>

int main()
{
    std::vector<std::pair<int, int>> myVec = { {1, 2}, {3, 4} };
    std::set<int> mySet;
    std::transform(myVec.begin(), myVec.end(), std::inserter(mySet, mySet.begin()),
                   [](const std::pair<int, int>& elem) { return elem.second; });
    for (int value : mySet)
    {
        std::cout << value << std::endl;
    }
    return 0;
}

Вывод:

2
4
0 голосов
/ 25 сентября 2018

Запрос однострочника в этом случае неизбежно приводит к решению с range-v3 :

#include <range/v3/view/map.hpp>

const std::vector<std::pair<int, int>> myVec{{1, 10}, {2, 20} , {3, 30}};
const std::set<int> mySet = myVec | ranges::view::values;

и аналогичному подходу с Boost range ¹:

#include <boost/range/adaptor/map.hpp>

using boost::adaptors::map_values;
const auto mySet = boost::copy_range<std::set<int>>(myVec | map_values); 

Однако вы можете считать этот подход наиболее простым (библиотеки не нужны, но требуется C ++ 17):

for (const auto& [first, second] : myVec)
    mySet.insert(second);

¹ Спасибо @Caleth за предложение об улучшениикомментарии.

0 голосов
/ 25 сентября 2018

Самый простой способ сделать это на C ++ y, вероятно, определить пользовательский тип итератора, который выдает только второе значение.

Вы можете использовать очень похожий код для более распространенного запроса, которыйчтобы взять значения из карты: адаптер итератора для итерации только значений в карте?

Или, вы знаете, просто написать цикл.В этом нет ничего плохого.

...