2015-02-09 115 views
6

如何将std :: vector转换为std :: tuple? 我C++:将向量转换为元组

class T { }; 
int cnt = 3; 
vector<T*> tv; 
for (int i = 0; i < cnt; ++i) { 
    tv.push_back(new T()); 
} 

我想

auto tp = std::tie(*tv[0], *tv[1], *tv[2]); 

我怎样才能得到这个TP? 如果cnt足够大,我不能手动编写此tp。

std::vector< 
    ConvConnection< 
    decltype(inputLayer), 
    decltype(*C1[0]), 
    decltype(*Conn1Opt[0]), 
    RandomInitialization<arma::mat>, 
    arma::mat 
    >* > Conn1(6); 

    for (size_t i = 0; i < 6; ++i) { 
    Conn1.push_back(new ConvConnection< 
        decltype(inputLayer), 
        decltype(*C1[0]), 
        decltype(*Conn1Opt[0]), 
        RandomInitialization<arma::mat>, 
        arma::mat 
        >(inputLayer, *C1[i], *Conn1Opt[i], 5, 5)); 
    } 

这是代码。这里只是6,但我也需要一些大小超过100的向量。我需要将这个向量转换为元组。

+0

如果手动写入过大或过于繁琐,请编写另一个生成它的程序。如果你想在运行时确定元组的大小,你不能。 – molbdnilo 2015-02-09 13:24:36

+1

为什么你需要一个元组?不会'std :: array '工作? – dasblinkenlight 2015-02-09 13:26:59

+2

一个无题nitpick:你应该有更好的变量/类名称。没有理由'cnt'不能写成'count'。什么是ConvConnection? 'Conn1Opt'?在2015年,你的源文件仍然适合你的硬盘驱动器,其中有一些额外的字符,其他开发人员看你的代码后会感谢你:) – Julian 2015-02-09 16:04:30

回答

7

你就是不行。由于矢量大小在运行时是已知的,但在编译时必须知道tuple类型(包括其大小)。

+0

然后我怎么能得到一个'大'元组?我想获得 auto tp = std :: tie(T1,T2,T3,... TN) 假设N足够大,我必须生成T1 ... TN dynamic。 假设我编写代码时N是固定的。 – 2015-02-09 13:20:03

+0

什么是'大'元组? – 2015-02-09 13:22:31

13

通常,您不能将vector转换为tuple。不过,如果你正在试图做的一切就是让元组<f(0), f(1), ..., f(N-1)>一些N这是一个常数表达式,那么这是可行的与索引顺序绝招:

template <typename F, size_t... Is> 
auto gen_tuple_impl(F func, std::index_sequence<Is...>) { 
    return std::make_tuple(func(Is)...); 
} 

template <size_t N, typename F> 
auto gen_tuple(F func) { 
    return gen_tuple_impl(func, std::make_index_sequence<N>{}); 
} 

,我们可以使用这样的:

// make a tuple of the first 10 squares: 0, 1, 4, ..., 81 
auto squares = gen_tuple<10>([](size_t i){ return i*i;}); 

为了您的具体使用情况,这将是:

auto connections = gen_tuple<6>([&](size_t i) { 
    return new ConvConnection< 
       decltype(inputLayer), 
       decltype(*C1[0]), 
       decltype(*Conn1Opt[0]), 
       RandomInitialization<arma::mat>, 
       arma::mat 
       >(inputLayer, *C1[i], *Conn1Opt[i], 5, 5); 
}); 
+0

谢谢。但是我需要元组,其中每个Ti是一个类。我用它来建立神经网络。由于NN的当前框架使用元组,但现在我的网络太大,我可以手动编写它。看来我必须改变框架或使用其他程序生成它。 – 2015-02-09 13:38:48

+0

@HurricaneTong你也可以在课堂上做到这一点。只需用'make_tuple(new T(Is)...)'替换'make_tuple(Is ...)'。 – Barry 2015-02-09 13:42:21

+0

我更新了问题并提供了真实的代码。元组中的每个类都有不同的构造参数。你能帮助我吗? – 2015-02-09 13:59:06

7

如果你有C++ 14,你可以做这样的:

template <typename T, std::size_t... Indices> 
auto vectorToTupleHelper(const std::vector<T>& v, std::index_sequence<Indices...>) { 
    return std::make_tuple(v[Indices]...); 
} 

template <std::size_t N, typename T> 
auto vectorToTuple(const std::vector<T>& v) { 
    assert(v.size() >= N); 
    return vectorToTupleHelper(v, std::make_index_sequence<N>()); 
} 

由于自动扣除,这是好的。在C++ 11中,如果没有自动扣除,则必须编写尾随decltype的返回类型。你也必须实现你自己的index_sequence