c ++: поменять местами первый и второй элемент для всех кортежей в векторе - PullRequest
0 голосов
/ 09 января 2020

есть ли способ поменять местами первый и второй элементы для всех кортежей в векторе? Допустим, у меня есть что-то вроде этого:

#include<vector>
#include<tuple>

int main()
{
std::vector<std::tuple<int,int>> my_vector;
my_vector.push_back(std::make_tuple(1,2));
my_vector.push_back(std::make_tuple(3,4));
}

Первые элементы кортежа теперь 1 и 3, а вторые элементы 2 и 4. Легко ли сделать 2 и 4 первыми элементами?

Ответы [ 2 ]

6 голосов
/ 09 января 2020

Вы можете использовать std::for_each алгоритм с лямбдой:

std::for_each(my_vector.begin(), my_vector.end(), [](auto& tuple) {
    std::swap(std::get<0>(tuple), std::get<1>(tuple));
});

Вы также можете использовать на основе диапазона for:

for (auto& tuple : my_vector)
    std::swap(std::get<0>(tuple), std::get<1>(tuple));

Если вы решите заменить std::tuple на std::pair, этот код также будет работать, поскольку члены std::pair first и second могут быть доступны с помощью std::get<0> и std::get<1> соответственно.


Вместо std::swap(...) вы можете написать это таким образом :

using std::swap;
swap(std::get<0>(tuple), std::get<1>(tuple));

Это полезно если вместо int у вас есть определенный пользователем тип T, для которого реализована функция void swap(T&, T&) (предположительно более производительная, чем std::swap) и может быть найдена с помощью зависимого от аргумента поиска .

2 голосов
/ 09 января 2020

Поскольку ваши std::tuple s содержат только два значения, я бы предложил вместо этого использовать std::pair.

#include <iostream>
#include <vector>
#include <utility>

int main()
{
    std::vector<std::pair<int,int>> my_vector;
    my_vector.push_back(std::make_pair(1,2));
    my_vector.push_back(std::make_pair(3,4));

    for (auto const& p : my_vector) {
        std::cout << p.first << " " << p.second << std::endl;
    }

    for (auto& p : my_vector) {
        std::swap(p.first, p.second);
    }

    for (auto const& p : my_vector) {
        std::cout << p.first << " " << p.second << std::endl;
    }
}

Живой пример

...