不同类型向量的C ++表

时间:2019-06-11 14:41:16

标签: templates vector data-structures generic-programming

我有一组不同类型的向量,像这样:

std::vector<int> a_values;
std::vector<float> b_values;
std::vector<std::string> c_values;

每次我都获得abc的新值时,我想将它们推到各自的向量a_valuesb_values和{{ 1}}。

我想以最通用的方式做到这一点,理想情况下,我可以迭代向量。所以我想要一个函数c_values,该函数自动在每个向量上调用相应的addValue(...)。如果我添加一个新向量push_back(),我只想在一个地方指定它即可。

此帖子https://softwareengineering.stackexchange.com/questions/311415/designing-an-in-memory-table-in-c的第一个答案似乎很有意义,但是我想轻松地将给定名称的向量取出,而不必手动转换为特定类型。即。我想打电话给d_values,这将给我基础getValues("d")

有人有这样做的集合类的基本示例吗?

1 个答案:

答案 0 :(得分:1)

这个想法可以通过异构容器tuple来实现,该容器可以存储包含不同类型元素的向量。

尤其是,我们可以如下定义一个简单的数据结构

template <typename ...Ts>
using vector_tuple = std::tuple<std::vector<Ts>...>;

在所提供示例的初始情况下,三个向量a_valuesb_valuesc_values仅对应于类型vector_tuple<int, float, std::string>。添加其他向量仅需要向我们的集合中添加其他类型。

在给定集合的情况下,将索引添加到我们的新集合中也很简单

vector_tuple<int, float, std::string> my_vec_tup;

我们采用以下方法提取a_values,b_values和c_values

auto const &a_values = std::get<0>(my_vec_tup);

auto const &b_values = std::get<1>(my_vec_tup);

auto const &c_values = std::get<2>(my_vec_tup);

请注意,tuple容器是在编译时建立索引的,如果您在编译时知道了预期的大小,那将是一个很好的选择,但否则不合适。

在已经提供的问题的描述中,向量的数量似乎确实是在编译时决定的,并且命名约定似乎是任意且恒定的(即,向量的索引不需要在运行时更改)。因此,如果将每个名称与整数索引相关联,则向量元组似乎是合适的解决方案。

对于问题的第二部分(即遍历每个向量),如果您使用的是C ++ 17,那么好消息是您可以简单地使用std::apply函数来这样做: https://en.cppreference.com/w/cpp/utility/apply 所需要做的就是传递一个带有向量的函数(您可能希望定义适当的重载来分别处理每个容器),并将元组传递到std::apply

但是,对于早期版本的C ++,您需要实现自己的for_each函数。幸运的是,此问题已解决:How can you iterate over the elements of an std::tuple?