【发布时间】:2014-01-09 04:25:33
【问题描述】:
假设我有一堆向量:
vector<int> v1;
vector<double> v2;
vector<int> v3;
长度相同。现在,对于每个索引 i,我希望能够将 (v1[i], v2[i], v3[i]) 视为一个元组,并可能传递它。事实上,我想要一个元组向量而不是向量元组,我可以使用它来完成上述操作。 (在 C 语言中,我可能会说结构数组而不是数组结构)。我不想影响任何数据重新排序(想想:真的很长的向量),即新向量由我传入的单个向量支持。让我们。
现在,我希望我编写的类(称其为 ToVBackedVoT,因为没有更好的名称)支持任意选择向量来支持它(不仅仅是 3,不是 int、double 和 int,不是每个都只是标量)。我希望元组向量是可变的,并且不希望在构造/分配时复制。
如果我理解正确,可变参数模板和 C++11 中的新 std::tuple 类型是执行此操作的方法(假设我不想要无类型的 void* 数组等)。然而,我几乎不认识他们,也从未与他们合作过。你能帮我勾勒出这样一个班级的样子吗?或者如何,给定
template <typename ... Ts>
我可以表达类似“模板参数列表是用这种类型的元素向量替换原始模板参数中的每个类型名”之类的东西?
注意:我想我以后可能还希望能够将其他向量连接到支持向量,使 ToVBackedVoT<int, double, int> 的实例成为 ToVBackedVoT<int, double, int, unsigned int> 的实例。因此,在回答时请记住这一点。不过,这并不重要。
【问题讨论】:
-
additional column to the table表示元组中的新类型? -
您希望底层存储像结构体数组还是数组结构体?这至少在效率方面很重要,并且取决于您的用例。
-
@JohnZwinck 我猜他设计的全部目的是拥有一个数组结构以提高效率,但他希望在 style of 数组中有一个很好的访问结构。
-
您可以围绕任意数量的向量编写迭代器包装器。这个包装器仅用于遍历向量集,仅此而已。这样,您的表中可以有很多“列”,但有几个不同的迭代器包装器,每个使用不同的列集(类似于同一张表上 SQL 中的简单“视图”)。这对您来说是一个不错的选择吗?
-
@JohnZwinck:就像 leems 建议的那样。澄清了我关于这一点的问题。
标签: c++ templates c++11 vector variadic-templates