std :: tuple vs std :: array作为std :: vector的项目

时间:2016-03-02 09:43:02

标签: c++ arrays c++11 vector tuples

我有这个案子:

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个整数并不是我想要反复重复的事情。

3 个答案:

答案 0 :(得分:6)

在我看来,这取决于这些事件是4 int s是偶然的,还是因为它来自同一类型的数据。

首选array,如果这些是相关的数字,这些数字应该都具有相同的类型(例如学生在4次考试中的分数)。您可能想要迭代这些,它们的类型是链接的......

首选tuplestruct / class如果这些是int不相关的,通常不具有相同的维度(例如阻力,电阻器的最大电压,长度......。

另一种决定方式是,您可能在未来的某个时候想要改变其中一个值而不是其他值的类型吗?

现在有一些案例在边缘。例如,盒子的长度,宽度和高度怎么样?它们都具有相同的尺寸(例如米),但它们具有不同的含义。迭代它们并没有多大意义。这实际上取决于您在代码中使用它的方式以及您查看正在使用的数据的方式。

就个人而言,在大多数可以使用tuple的情况下,我更喜欢使用class,因为它提供了更具可读性的代码和更多的进化灵活性:您提供有意义的名称,您决定对于属性的可见性,您可以封装信息,您可以提供帮助方法......

这种代码:

BoxSize clothesBoxSize(5, 4, 10); 
double volume = clothesBoxSize.Volume();

甚至,如果你想防止混合宽度,长度和高度(参见Scott Meyers'Effective C++的第18项):

BoxSize clothesBoxSize(Length(5), Width(4), Height(10));
double volume = clothesBoxSize.Volume();

比以下更具可读性,可测试性和可维护性(在我看来)

std::tuple<int, int, int> clothesBoxSize{5, 4, 10};
double volume = clothesBoxSize[0] * clothesBoxSize[1] * clothesBoxSize[2];

答案 1 :(得分:4)

对于这个具体案例,我不得不同意这些意见。对于同类型容器 - 就像这里的情况一样(所有int s) - array是优越的。

在查看std::tuplestd::array的界面时,很明显后者是一个容器(例如迭代器),而前者不是。这意味着标准库的其余部分将更自然地适用于后者。

如果类型不是同质的,那就不会有问题 - 它必须是std::tuple

答案 2 :(得分:3)

这在很大程度上取决于用例,但如果元素以某种方式相关,我会选择array。您可以迭代数组并使用std算法。

我通常认为tuple可替代struct替代的内容,如:

struct fourIntegers{
  int int1;
  int int2;
  int int3;
  int int4;
};

有时tuple比新struct更紧凑/清晰。