2015-04-05 128 views
2

我在教自己使用模板,並一直在懷疑是否有一種方法來以通用方式遍歷嵌套容器。我已經看到了以這種方式遍歷單個容器的例子。嵌套的泛型容器迭代C++

這是一個向量向量的函數示例。我想爲valarrays和數組數組創建此工作,而無需爲每個數組編寫單獨的函數。提前致謝。

// matrix sum of two vectors of vectors 
template<typename T> 
vector<vector<T>> sum(vector<vector<T>> const &M1, 
         vector<vector<T>> const &M2) { 
    vector<vector<T>> MS(M2.size(), vector<T>(M2[0].size())); 
    for (unsigned int i = 0; i < MS.size(); ++i) { 
     for (unsigned int j = 0; j < MS[i].size(); ++j) { 
      MS[i][j] = M1[i][j] + M2[i][j]; 
     } 
    } 
} 
+0

我們在這裏討論了多少維數,即您考慮了多少個嵌套向量?如果兩個(二維數組)我不認爲有一個可以滿足您的條件的源代碼:「無需爲每個函數編寫單獨的函數」,因爲解決方案需要模板專業化 - 兩個矢量分離函數和類型不是矢量。 – 2015-04-05 20:24:56

+0

我在想這種情況下的2D容器。 – pinetreepatzer 2015-04-06 18:40:03

回答

-1

我建議以下(在STL風格):

這種風格的
// matrix sum of two twodimensional containers 
template<typename InputIterator, typename OutputIterator> 
OutputIterator sum(InputIterator first1, InputIterator last1, 
        InputIterator first2, OutputIterator result) { 
    if(first1 == last1) { return result; } // Check for empty container 

    for (; first1 != last1; ++first1, ++first2) {   
     std::transform(std::begin(*first1), std::end(*first1), 
         std::begin(*first2), std::begin(*result), 
         std::add<void>{}); 
     ++result; 
     // Please be aware that this only works if the result container 
     // has already the dimensions of the input containers. 
     // std::back_inserter does not work with this implementation. 
    } 
    return result; 
} 

算法應該與正常的數組,向量的std ::陣列等工作...

注意:此算法未經測試。 編輯:此算法在C++ 14中工作。

+0

我無法讓它工作。今天晚些時候我會試着擺弄它。不過謝謝。 – pinetreepatzer 2015-04-06 19:02:30

+0

我測試了它,它適用於C++ 14標準(而不是'std :: add {}''您可以使用'[](auto l,auto r){return l + r;}') – Otomo 2015-04-06 21:15:35