我有一组不同类型的向量,像这样:
std::vector<int> a_values;
std::vector<float> b_values;
std::vector<std::string> c_values;
每次我都获得a
,b
和c
的新值时,我想将它们推到各自的向量a_values
,b_values
和{{ 1}}。
我想以最通用的方式做到这一点,理想情况下,我可以迭代向量。所以我想要一个函数c_values
,该函数自动在每个向量上调用相应的addValue(...)
。如果我添加一个新向量push_back()
,我只想在一个地方指定它即可。
此帖子https://softwareengineering.stackexchange.com/questions/311415/designing-an-in-memory-table-in-c的第一个答案似乎很有意义,但是我想轻松地将给定名称的向量取出,而不必手动转换为特定类型。即。我想打电话给d_values
,这将给我基础getValues("d")
。
有人有这样做的集合类的基本示例吗?
答案 0 :(得分:1)
这个想法可以通过异构容器tuple
来实现,该容器可以存储包含不同类型元素的向量。
尤其是,我们可以如下定义一个简单的数据结构
template <typename ...Ts>
using vector_tuple = std::tuple<std::vector<Ts>...>;
在所提供示例的初始情况下,三个向量a_values
,b_values
,c_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?