gpt4 book ai didi

c++ - 有没有一种很好的方法可以将 std::minmax(a, b) 分配给 std::tie(a, b)?

转载 作者:IT老高 更新时间:2023-10-28 13:24:17 26 4
gpt4 key购买 nike

std::tie(a, b) = std::minmax(a, b);

我认为这是直观的代码。干净易懂。太糟糕了,它没有按预期工作,如 std::minmax const& 的模板.如果因此在 std::pair<const&, const&> 中交换值一个分配将覆盖另一个值:

auto[a, b] = std::make_pair(7, 5);

std::tie(a, b) = std::minmax(a, b);

std::cout << "a: " << a << ", b: " << b << '\n';

a: 5, b: 5

这里的预期输出是a: 5, b: 7 .


我认为这很重要,因为实现转换函数以将函数应用于某些范围需要直观 lambda 的此类语句。例如:

std::vector<int> v{ 0, 1, 0, 2, 0 };
std::vector<int> u{ 1, 0, 1, 0, 1 };

perform(v.begin(), v.end(), u.begin(), [](auto& a, auto& b){
std::tie(a, b) = std::minmax(a, b);
});

//v would be == {0, 0, 0, 0, 0}
//u would be == {1, 1, 1, 2, 1}

我发现的一个解决方案是构建 std::tuple std::pair<const&, const&> 上明确没有任何引用限定符强制执行拷贝:

std::tie(a, b) = std::tuple<int, int>(std::minmax(a, b)); 

但是这个<int, int>冗余似乎相当糟糕,尤其是在说过 auto& a, auto& b 时前。


有没有一种很好的、​​简短的方法来执行这个任务?会不会是方​​向不对,只是说if (a >= b) { std::swap(a, b); }会是这里最好的方法吗?

最佳答案

您可以为 minmax 使用初始化列表:

std::tie(a, b) = std::minmax({a, b});

这会导致创建临时对象,就像使用 unary plus 时一样,但它的好处是它也适用于缺少 unary plus 运算符的类型。 p>

using namespace std::string_view_literals;

auto [a, b] = std::make_pair("foo"sv, "bar"sv);
std::tie(a, b) = std::minmax({a, b});
std::cout << "a: " << a << ", b: " << b << '\n';

输出:

a: bar, b: foo

Could it be that this is the wrong direction and just saying if (a >= b) { std::swap(a, b); } would be the best approach here?

我会成功的 if(b < a) std::swap(a, b);因为 Compare 1 要求,但是是的,我怀疑这会更快,并且仍然非常清楚您要完成什么。


[1] 比较 [...] 应用于对象的函数调用操作的返回值 满足比较的类型,当上下文转换为 bool 时, 如果调用的第一个参数出现在 在这种类型引起的严格弱序关系中排名第二,并且 否则为假。

关于c++ - 有没有一种很好的方法可以将 std::minmax(a, b) 分配给 std::tie(a, b)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56739747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com