存储同一类型的两个相关值的惯用方法
Idiomatic way to store two related values of the same type
这将是一个非常简单的问题:在C++03中,我将使用std::pair
存储两个相同类型的值。然而,当我希望我的两个值都是同一类型时,必须重复两次类型在某种程度上是一种麻烦。现在,有了C++11,我们就有了std::array
。这样写会更习惯吗:
std::array<int, 2> foo;
而不是:
std::pair<int, int> foo;
当目标是存储两个相关的数据(例如,一个函数求解二次方程的结果)时?
我不认为在标准库或Boost中有任何适合这种情况的数据类型
pair<T, T>
是绝对错误:
如果make_pair(1, 2) == make_pair(2, 1)
表示多项式的根,则CCD_4应为true!
出于同样的原因,数组/向量也不起作用,除非您更改比较行为。
所以我想说,制作一个bag<T, N>
数据类型,它代表一个固定大小的multiset<T>
,有点像array<T, N>
代表固定大小的CCD 8。
由于大小很小,您可以通过蛮力(比较、相等性检查等)来完成所有操作。
我仍然会使用pair来指示一个值与另一个值相关。数组并没有向我传达这个意思。
std::pair
在两个项目之间有关系并且想要描述这种关系的情况下是有意义的。
然而,在你的情况下,我会使用std::array
,因为二次方程的两个解彼此之间没有任何关系(我可以看到解和等式之间的关系,但不能看到两个解之间的关系)。
取决于较大的上下文。
在你提到的例子中,我会使用std::array
,因为这样你也可以在等式的次数上模板化函数:
template <int N>
std::array<double, N> solveEquation(const Polynomial<N>& poly);
我认为std::pair<>
的相应C++11抽象是std::tuple<>
,因为对只是元组的特例。
std::pair<>
不一定具有相同的类型,BTW.
正是出于惯用的原因,我建议使用pair
a表示两个值都是相关的,而array
与值列表更相关(在我看来)。
例如,在您建议的用法中,两个值之间的关系将是二次函数本身。
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 比较两个节点坐标的最佳方法是什么?
- 比较C++中两个整数的最有效和最干净的方法是什么?
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 检查两个向量是否并行的最有效方法
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- 仅通过C++中数组初始化的不同方法,即可在同一输入上获得两个不同的答案
- 区分两个零arg构造函数的惯用方法
- 在C++中将返回unique_ptr和shared_ptr的两个工厂方法组合为一个
- 有没有办法仅在两个模板参数相同时才覆盖匹配的模板方法?
- std::list 的两个 insert() 方法签名之间的实现差异
- 两个继承类如何调用彼此的方法?
- 两个类之间的共享方法
- 两个模板类,其中的方法相互调用
- 计算两个uint8_t变量之间差值的最快方法是什么?
- 如何拥有两个名称相同但返回类型不同的纯虚拟方法
- 在 c++ 中抽象两个略有不同的函数的最佳方法是什么?
- 有没有更好的方法来添加两个智能指针?