2015-02-09 64 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