有没有一种好的方法将 std::minmax(a, b) 分配给 std::tie(a, b) ?

2024-01-24

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

我认为这是直观的代码。干净且易于理解。太糟糕了,它没有按预期工作,因为std::minmax https://en.cppreference.com/w/cpp/algorithm/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';

甲:5,乙: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 https://en.cppreference.com/w/cpp/utility/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});

这会导致创建临时对象,就像使用时一样一元加,但好处是它适用于缺乏一元加运营商也。

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';

Output:

a: bar, b: foo

难道这是方向错误,只是说if (a >= b) { std::swap(a, b); }这是最好的方法吗?

I'd make it if(b < a) std::swap(a, b); because of the Compare https://en.cppreference.com/w/cpp/named_req/Compare1 requirement, but yes, I suspect that'll be faster and it's still very clear what you want to accomplish.


[1] Compare [...] The return value of the function call operation applied to an object of a type satisfying Compare, when contextually converted to bool, yields true if the first argument of the call appears before the second in the strict weak ordering relation induced by this type, and false otherwise.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有一种好的方法将 std::minmax(a, b) 分配给 std::tie(a, b) ? 的相关文章

随机推荐

  • Redis:可能使数组或排序集中的元素过期吗?

    目前是否只能使整个键 值对过期 如果我想将值添加到列表类型结构并让它们在插入后 1 小时自动删除 该怎么办 目前是否可行 或者是否需要运行 cron 作业来手动进行清除 有一个通用模式可以很好地解决这个问题 使用排序集 并使用时间戳作为分数
  • 取消透视从另一个表中获取的列

    我有超过 500 个列需要在取消透视时使用 select col1 col2 col3 from select from table unpivot col3 for col2 in value value2 value788 因此 我没有
  • Conv1D 层 Keras 的 input_shape

    我正在尝试制作一个用于非图像数据集二元分类的 CNN 模型 我的模型 代码正在运行并产生非常好的结果 准确性很高 但我无法理解input shape第一层参数Conv1D X 或输入的形状 此处x train df 为 2000 28 它有
  • 如何为 Nexus5 和 Nexus 5x 设置正确的边距

    我正在开发该应用程序 现在遇到了很大的问题 据我们所知 nexus 5 和 nexus 5x 使用相同的资源目录 xxhdpi 我的观点由于一些空白而被打破 即我必须为 nexus 5 设置 40dp 为 nexus5x 设置 65dp 那
  • 如何在 Eclipse PDE 中表达项目间依赖关系

    我正在寻找处理混合项目类型之间项目间依赖关系的最佳实践 其中一些项目是 eclipse 插件 OSGI 捆绑项目 RCP 应用程序 而其他项目只是普通的旧 java 项目 Web 服务模块 很少有 Eclipse 插件依赖于 Java 项目
  • Bootstrap 中占位符颜色变化

    如何更改 Bootstrap 中的占位符颜色 我尝试过以下代码 但不起作用 input webkit input placeholder color red input moz placeholder color red form cont
  • 异步 HttpHandler 和 WriteAsync

    我一直在 Ayende Rahien 的博客上尝试一些代码here http ayende com blog 72705 node cs它演示了使用异步 HttpHandler 来提高可以并发处理的请求数量 不幸的是我什至可以让基本的例子工
  • mapreduce 复合关键示例 - 未显示所需的输出

    作为mapreduce和hadoop世界的新手 在尝试了基本的mapreduce程序之后 我想尝试compositekey示例代码 输入数据集如下 国家 州 县 百万人口 美国 加利福尼亚州 阿拉米达 100 美国 加利福尼亚州 洛杉矶 2
  • 使用 List 类型的私有变量帮助 Java 中的抽象类

    自从我上次用 Java 编写代码以来已经有两年了 所以我的编码技能有点生疏了 我需要将数据 用户配置文件 保存在不同的数据结构中 ArrayList and LinkedList 并且他们都来自List 我希望尽可能避免代码重复 并且我还希
  • RabbitMQ 数据库文件

    我正在运行 RabbitMQ V 2 0 0 在 Linux 机器上 mnesia 库默认是当前的 但 Rabbit 在该目录中创建目录 例如 电子邮件受保护 cdn cgi l email protection 目录名称中的ip基于机器的
  • time.perf_counter() 或 time.process_time() 用于性能测量?

    我了解 time perf counter 测量经过的总时间 即使进程当前未运行 然而 time process time 仅测量进程实际运行的时间 如果我只是衡量一个功能的性能 这两个中哪一个是首选 由于我实际上对 CPU 花在处理其他进
  • 使用 python 的 eval() 与 ast.literal_eval()

    我遇到一些代码的情况eval 提出了一个可能的解决方案 现在我从来没有使用过eval 但在此之前 我已经了解到很多有关它可能造成的潜在危险的信息 也就是说 我对使用它非常谨慎 我的情况是我有用户提供的输入 datamap input Pro
  • Windows 进程什么时候会耗尽内存?

    在 Windows Server 2003 Enterprise Edition SP2 下 3GB 开关未启用 据我了解 一个进程的最大可寻址内存是 4GB 我可能是错的 那是 2GB 的私有字节和 2GB 的虚拟字节吗 当达到私有字节限
  • 如何使用 sqlalchemy 创建带有日期范围的排除约束

    我知道只需使用原始 sql 我就可以添加排除约束 如下所示 ADD CONSTRAINT unique daterange constraint EXCLUDE USING gist foo WITH daterange start dat
  • PyInstaller:模块未包含在 --onefile 中,但与 --onedir 一起工作正常

    我正在使用 PyInstaller 将我的应用程序捆绑到一个 exe 文件中 问题是它与 onedir 选项一起工作正常 但在使用 onefile 构建时找不到模块 onedir 和 onefile 在构建过程中都会说 lt gt INFO
  • 显示大型结果集

    这是我的问题 我需要存储一个lot日志消息 并认为将其保存在 SQLite3 数据库中以便能够轻松搜索和过滤它是明智的 我将在标准列表小部件中显示日志消息 使用 wxWidgets 该列表将有几列 并且可以由用户排序和过滤 现在 我不确定处
  • Excel 重命名其他计算机上的 Activex 控件

    我有一个带有 Activex 控件 组合框 命令按钮 选项按钮 复选框 的工作表 在我的计算机上 我已重命名所有控件 例如 CButtonPMR OButton Comp 等 但是当我在其他计算机上打开文件时 所有控件都被重命名为默认的默认
  • 在非 Windows 平台(Linux 或 Mac)上使用 Python 处理 Access 数据库

    我想访问 Microsoft Access 数据库中的数据 我有一些 accdb 和 mdb 文件 想用 Python 读取它们 根据我的研究 pyodbc只能在Windows平台上使用 但我正在Mac OS X上工作 我是Python新手
  • 使用弱密钥暴力破解 DES

    我正在学习密码学课程 但正在做一项作业 说明如下 明文 plain6 txt 已使用 DES 加密为 encrypt6 dat 使用 64 位密钥作为 8 个字符的字符串给出 64 位 其中每第 8 位被忽略 所有字符均为字母 小写或大写
  • 有没有一种好的方法将 std::minmax(a, b) 分配给 std::tie(a, b) ?

    std tie a b std minmax a b 我认为这是直观的代码 干净且易于理解 太糟糕了 它没有按预期工作 因为std minmax https en cppreference com w cpp algorithm minma