【问题标题】:c++: Swap first and second element for all tuples in a vectorc ++:交换向量中所有元组的第一个和第二个元素
【发布时间】:2020-01-09 14:01:24
【问题描述】:

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

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

【问题讨论】:

  • 你尝试了什么?
  • std::tuple 可以有两个以上的元素。你为什么不改用std::pair
  • 所以您的问题实际上是:“如何交换 2 元素元组的第一个和第二个值?”
  • 有没有办法为向量中的所有元组交换第一个和第二个元素? -- 如果答案是“否”,C++ 将是一个非常语言薄弱。
  • 我认为 Jabberwocky 只是想指出元组在向量中并不重要。如果你知道如何用一个来做,你也可以在一个循环中做很多

标签: c++ vector tuples swap


【解决方案1】:

您可以将std::for_each 算法与 lambda 一起使用:

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&lt;0&gt;std::get&lt;1&gt;


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

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

如果您有一些用户定义类型 T 而不是 int,这很有用,它实现了 void swap(T&amp;, T&amp;) 函数(可能比 std::swap 性能更高)并且可以通过 argument-dependent lookup 找到.

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @foreknownas_463035818 确定。我正打算添加它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多