- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正试图了解元组(感谢@litb),使用它们的常见建议是返回 > 1 值的函数。
这是我通常会使用结构的东西,在这种情况下我无法理解元组的优势 - 对于最终懒惰的人来说,这似乎是一种容易出错的方法。
Borrowing an example ,我会用这个
struct divide_result {
int quotient;
int remainder;
};
使用元组,您将拥有
typedef boost::tuple<int, int> divide_result;
但是,如果不阅读您正在调用的函数的代码(或注释,如果您愚蠢到相信它们),您将不知道哪个 int 是商,反之亦然。好像有点……
struct divide_result {
int results[2]; // 0 is quotient, 1 is remainder, I think
};
...这不会让我充满信心。
那么,元组相对于弥补歧义的结构的优势是什么?
最佳答案
我想我同意你的观点,即什么位置对应什么变量的问题会引起混淆。但我认为有两个方面。一个是call-side,一个是callee-side:
int remainder;
int quotient;
tie(quotient, remainder) = div(10, 3);
我认为我们得到的结果非常清楚,但如果您必须一次返回更多值,它可能会变得困惑。一旦调用者的程序员查阅了div
的文档,他就会知道什么位置是什么,并且可以编写有效的代码。根据经验,我会说不要一次返回超过 4 个值。除此之外,更喜欢结构。
当然也可以使用输出参数:
int remainder;
int quotient;
div(10, 3, "ient, &remainder);
现在我认为这说明了元组如何优于输出参数。我们将 div
的输入与其输出混合在一起,但没有获得任何优势。更糟糕的是,我们让该代码的读者对 div
的 actual 返回值可能是什么感到怀疑。当输出参数有用时,有 个很好的例子。在我看来,只有在没有其他方法的情况下才应该使用它们,因为返回值已经被采用并且不能更改为元组或结构。 operator>>
是使用输出参数的一个很好的例子,因为返回值已经为流保留,所以你可以链接 operator>>
调用。如果您与运算符无关,并且上下文不是很清楚,我建议您使用指针,在调用端发出信号表明该对象实际上用作输出参数,以及适当的注释。
第三种选择是使用结构体:
div_result d = div(10, 3);
我认为这肯定会因清晰而获奖。但请注意,您仍然必须访问该结构中的结果,并且结果不会“裸露”在 table 上,因为输出参数和与 tie
一起使用的元组就是这种情况。
我认为这些天来的一个重点是让一切尽可能通用。所以,假设你有一个可以打印元组的函数。你可以这样做
cout << div(10, 3);
并显示您的结果。我认为另一方面,元组显然因其多功能性质而获胜。使用 div_result 执行此操作,您需要重载 operator<<,或者需要单独输出每个成员。
关于c++ - Boost::Tuples vs Structs 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/409827/
我有一个包含文件名 和文件路径 的元组列表。我想找到重复的 filename(但 filepath 可能不同),即文件名相同但 filepath 可能不同的元组。 元组列表示例: file_info
我有一个像这样定义的变量 auto drum = std::make_tuple ( std::make_tuple ( 0.3f , Ex
我有一个包含几个字段的自定义结构,我想在快速 switch 语句中对其进行模式匹配,这样我就可以通过将其中一个字段与另一个字段进行比较来自定义匹配正则表达式。 例如鉴于这种结构: struct MyS
我有一种动态元组结构: template //Should only be tuples class DynamicTuple { vector data; //All data is st
这个问题在这里已经有了答案: What and When to use Tuple? [duplicate] (5 个答案) 关闭 8 年前。 我正在查看 Tuple 的在线示例,但我没有看到任何理
在我的项目中我有很多坐标要处理,在二维情况下我发现(cons x y)的构造比(list x y)快和 (vector x y)。 但是,我不知道如何将 cons 扩展到 3D 或更进一步,因为我没有
我有以下 Scala 代码: def f(x: Int, y: Int): Option[String] = x*y match { case 0 => None case n =>
我的直觉告诉我,在一般情况下,只有宏或复杂类型的体操才能解决这个问题。 Shapeless 或 Scalaz 可以在这里帮助我吗?这是 N=2 问题的具体实例,但我正在寻找的解决方案适用于所有合理的
为什么这段 Scala 代码是这样的: class Test { def foo: (Int, String) = { (123, "123") } def bar: Unit
我是 python 和 pygame 的新手,我正在尝试学习向量和类的基础知识,但在这个过程中我搞砸了,而且我在理解和修复标题中的错误消息方面苦苦挣扎。 这是我的 Vector 类的代码: impor
我正在编写一个程序来打开和读取一个 txt 文件,并在每一行中循环。将第 2 列和第 4 列中的值相乘并将其分配给第 5 列。 A 500.00 A 84.15 ? B 648.80 B 77.61
我知道还有其他几个问题提出了完全相同的问题,但是当我运行时: 导入命令 从 pyDes 导入 * def encrypt(data, password,): k = des(password,
我有一个元组列表,内容如下: >>>myList [(), (), ('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', '
给定一个 boost::tuple 和 std::tuple,你如何在它们之间进行转换? 也就是说,您将如何实现以下两个功能? template boost::tuple asBoostTuple(
我无法初始化 std::tuple来自 std::tuple 的逐元素元素兼容类型。为什么它不像 boost::tuple 那样工作? #include #include template st
我是 Storm 的新手并且我正在尝试找出如何编写一个 bolt 测试来测试子类 BaseRichBolt 中的 execute(Tuple tuple) 方法。 问题是 Tuple 似乎是不可变的,
如果我有如下元组列表: [('a', 'b'), ('c', 'd'), ('a', 'b'), ('b', 'a')] 我想删除重复的元组(在内容和内部项目顺序方面重复)以便输出为: [('a',
我编写了一个简单的脚本来模拟基于每用户平均收入 (ARPU)、利润率和客户保持客户的年数 (ltvYears) 的客户生命周期值(value) (LTV)。下面是我的脚本。它在“ltvYears =
以下是我的代码,它是一组元组:。输出:设置([(‘A’,20160129,36.44),(‘A’,20160104,41.06),(‘A’,20160201,37.37)])。如何将另一个元组(‘A’
我用以下代码编写了一个程序: import pandas as pd import numpy as np from typing import Tuple def split_data(self,
我是一名优秀的程序员,十分优秀!