【问题标题】:C++ Table of Vectors of Different Types不同类型向量的 C++ 表
【发布时间】:2019-06-11 14:41:16
【问题描述】:

我有一组不同类型的向量,如下所示:

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

每次我得到abc 的新值时,我都想将它们推送到它们各自的向量a_valuesb_valuesc_values

我想以最通用的方式执行此操作,理想情况下我可以迭代向量。所以我想要一个函数addValue(...),它会在每个向量上自动调用相应的push_back()。如果我添加一个新向量 d_values 我只想在一个地方指定它。

这篇文章https://softwareengineering.stackexchange.com/questions/311415/designing-an-in-memory-table-in-c 的第一个答案似乎是相关的,但我想轻松获取给定名称的向量,而无需手动转换为特定类型。 IE。我想打电话给getValues("d"),这会给我底层的std::vector

有没有人有一个这样做的集合类的基本示例?

【问题讨论】:

    标签: templates vector data-structures generic-programming


    【解决方案1】:

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

    具体来说,我们可以定义一个简单的数据结构如下

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

    在初始情况下,在提供的示例中,三个向量 a_valuesb_valuesc_values 仅对应于类型 vector_tuple&lt;int, float, std::string&gt;。添加一个额外的向量只需要在我们的集合中添加一个额外的类型。

    索引到我们的新集合也很简单,给定集合

    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 函数来执行此操作:@987654321 @ 所需要的只是传递一个接受向量的函数(您可能希望定义适当的重载以分别处理每个容器),并将您的元组传递给std::apply

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多