【问题标题】:How to create a vector of tuples in C++?如何在 C++ 中创建元组向量?
【发布时间】:2020-01-08 08:56:46
【问题描述】:

有一个生成器,每次迭代都会生成一个 16 个整数的元组。我想将这些元组添加到向量中。在创建向量时,我必须写 std::vector<std::tuple<int, int, .... 16 times>>。有没有另一种方法来创建这些元组的向量。

测试元组包含 5 个整数的情况的代码:

#include "cppitertools/itertools.hpp"
#include <iostream> 
#include <tuple>
#include <vector> 

int main()
{
    std::vector<int> v1{0, 1};
    std::vector<std::tuple<int, int, int, int, int>> states;

    for (auto&& i : iter::product<5>(v1)) 
    {
        states.push_back(i);
    }

    auto size = states.size();
    std::cout << size << std::endl;

}

我正在使用cppiterator

【问题讨论】:

  • 我不知道该工具是什么以及它提供了哪些接口,但听起来 16 个整数的 std::array 比 16 个整数的元组更好。
  • 所以你不想写int, 16次?
  • @songyuanyao 我想将此代码用作实验的一部分,其中数字从 4 到 100 不等。所以写 int, 100 次是不可扩展的。
  • @papabiceps iter::product&lt;5&gt;(v1)的返回类型是什么?
  • 如果数字不同,请改用向量。所以一个向量的向量。如果它们仅在编译时变化,您可以将该数字放入 constexpr 并仍然使用 std::array

标签: c++ stdvector stdtuple


【解决方案1】:
template<size_t Remaining, typename Type,typename ... Args>
struct make_tuple_n_impl{
    using type=typename make_tuple_n_impl<Remaining-1,Type,Type,Args...>::type;
};

template<typename T,typename ... Args>
struct make_tuple_n_impl<0,T,Args...>{
    using type=std::tuple<Args...>;
};

template<size_t Count,typename Type>
using tuple_of=typename make_tuple_n_impl<Count,Type>::type;

那么tuple_of&lt;5,int&gt; 就是std::tuple&lt;int,int,int,int,int&gt;

【讨论】:

  • 如何使用它来创建向量?我认为我使用不正确,因为我无法编译。我是这样用的std::vector&lt;tuple_of&lt;5,int&gt;&gt; states;
  • 我正在使用 g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
  • 是的,有一个错字。我修好了。
【解决方案2】:

你可以随便摆弄iter::product 创建的元组类型

#include "cppitertools/itertools.hpp"
#include <iostream> 
#include <tuple>
#include <vector> 

template <typename>
struct remove_tuple_reference;

template <typename... Ts>
struct remove_tuple_reference<std::tuple<Ts...>> {
    using type = std::tuple<std::remove_reference_t<Ts>...>;
};

template <typename T>
using remove_tuple_reference_t = typename remove_tuple_reference<T>::type;

int main()
{
    std::vector<int> v1{0, 1};
    using tup = remove_tuple_reference_t<decltype(iter::product<5>(v1).begin())::value_type>;
    std::vector<tup> states;

    for (auto&& i : iter::product<5>(v1)) 
    {
        states.push_back(i);
    }

    auto size = states.size();
    std::cout << size << std::endl;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多