首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有把std::minmax(a,b)赋值给std::tie(a,b)的好方法?

有没有把std::minmax(a,b)赋值给std::tie(a,b)的好方法?
EN

Stack Overflow用户
提问于 2019-06-24 23:27:13
回答 2查看 2.7K关注 0票数 61
代码语言:javascript
复制
std::tie(a, b) = std::minmax(a, b);

我认为这是直观的代码。干净易懂。太糟糕了,它不能像const&std::minmax模板那样正常工作。因此,如果在std::pair<const&, const&>内交换这些值,则一个赋值将覆盖另一个值:

代码语言:javascript
复制
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

我认为这一点很重要,因为实现转换函数将函数应用于某些范围需要这样的语句来实现直观的lambdas。例如:

代码语言:javascript
复制
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::pair<const&, const&>上显式构造std::tuple,而不使用任何引用限定符来强制执行副本:

代码语言:javascript
复制
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); }将是最好的方法?

EN

回答 2

Stack Overflow用户

发布于 2019-06-24 23:34:43

您可以按如下方式以一定的简洁性强制执行此操作。

代码语言:javascript
复制
std::tie(a, b) = std::minmax(+a, +b);

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

说明:内置的一元加运算符,为了与它的一元减号同级的对称性,通过值返回它的操作数(它也执行通常的算术转换,但这不适用于int)。这意味着它必须创建一个临时值,即使这个临时值只是操作数的副本。但是对于本例中minmax的用法,这就足够了:这里交换引用不再通过赋值,因为右侧的引用(传递给minmaxconst int&参数)与左侧的引用(在std::tie创建的引用的tuple内)引用的对象不同。

输出是所需的:

a: 5,b: 7

票数 28
EN

Stack Overflow用户

发布于 2019-06-26 22:30:40

有时,后退一步并找到一种不同的方式会带来回报:

代码语言:javascript
复制
if (b < a)
    std::iter_swap(&a, &b);

这很简洁,而且通常更有效,至少在同等水平上是这样的。也许可以将它打包到它自己的函数中:

代码语言:javascript
复制
template <class T>
void reorder(T& a, T& b)
noexcept(noexcept(b < a, void(), std::iter_swap(&a, &b))) {
    if (b < a)
        std::iter_swap(&a, &b);
}

我使用的是std::iter_swap(),所以我不需要在C++2a之前的版本中使用using std::swap; swap(a, b)的两步通用性,它引入了customization point objects,使之过时。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56739747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档