c ++:交换向量中所有元组的第一个和第二个元素

c++: Swap first and second element for all tuples in a vector

有没有办法交换向量中所有元组的第一个和第二个元素? 假设我有这样的东西:

#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 成为第一个元素?

您可以使用带有 lambda 的 std::for_each 算法:

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

您也可以使用 range-based for:

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

如果您决定将 std::tuple 替换为 std::pair,此代码也将有效,因为 std::pair 的成员 firstsecond can be accessed分别使用std::get<0>std::get<1>


而不是 std::swap(...) 你可能想写 :

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

如果您有一些用户定义类型 T 而不是 int,这将很有用,为此实现了 void swap(T&, T&) 函数(可能比 [=26= 更高效) ]) 并且可以通过 argument-dependent lookup.

找到

由于您的 std::tuple 仅包含两个值,我建议您改用 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;
    }
}

Live example