std::tuple与std::array作为std::vector的元素的比较

10

我有这个案例:

std::vector<4_integers> v;

这里最适合什么?

std::tuple 解决方案:

std::vector<std::tuple<int,int,int,int>> v;

std::array 解决方案:

std::vector<std::array<int,4>> v;

为什么?

编辑(使用情况):

很抱歉之前没有提到。我将按照以下方式使用它:

for(const auto& item:v){
   some_function(item[0],item[1],item[2],item[3]); // or tuple equivalent 
}
当然,我需要将它们存储起来,因为反复计算这4个整数并不是我想做的事情。

当然,我需要将它们存储起来,因为反复计算这4个整数并不是我想做的事情。


4
两者都可能是某些问题的解决方案……现在一切取决于你面临的具体问题是什么。请注意,所有问题并不相等,就像所有解决方案也不相等一样。 - Nawaz
取决于你如何使用它们。 - marom
用例已添加。谢谢。 - Humam Helfawi
2个回答

10
针对这种情况,我不同意评论中的观点。对于同质类型容器 - 此处是所有 int - array 更优。
当查看 std::tuplestd::array 的接口时,很清楚后者是一个容器(例如具有迭代器),而前者不是。这意味着标准库的其余部分将更自然地适用于后者。
如果类型不是同质的,那么问题就不存在了-必须使用std::tuple

当OP还没有告诉我们他要解决什么问题时,你对OP的用例做了很多假设。我们所知道的是,他可能有成千上万个基于std::tuple的代码行需要进行接口处理。或者元组中的int实际上可能来自单独的模板参数,在某些特定情况下恰好相等。 - Christian Hackl
类型可以偶然地是同质的(这启发了我回答)。 - Colin Pitrat
是的,你们两个都是对的 - 这个答案假设类型是同质的且有一定的意义。好观点。 - Ami Tavory

4
这很大程度上取决于用例,但如果元素以某种方式相关,则我会选择数组。您可以遍历数组并使用标准算法进行操作。
我通常认为元组是替代结构体的一种方式,例如:
struct fourIntegers{
  int int1;
  int int2;
  int int3;
  int int4;
};

有时候,元组比新的结构体更加紧凑/清晰。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接