2015-10-04 94 views
1

我已經閱讀了大量有關這個確切主題的問題和答案,但他們都沒有幫助我弄清楚這一點。如何初始化pre-C++ 11語法中的向量向量?

我已經矢量的矢量被使用C++ 11碼,像這樣初始化:

return { {1,1,1}, {1,2}, {2,1}, {3} }; 

如何可以轉換該預C++ 11語法中如幾行儘可能?

+0

不幸的是,我想你需要創建一個'vector',因此另一個'vector',一次填充後面的'push_back',並將其推回到前者,以此類推其他# – skypjack

+0

將你的編譯器轉換成一個兼容C++ 11的版本:)當然在開玩笑...... – vsoftco

回答

2

分配或從建築的陣列是一個簡單的選擇:

int temp[] = { 1, 1, 1, 1, 2, 2, 1, 3 }; 
std::vector<std::vector<int>> a(4); 
a[0].assign(&temp[0], &temp[3]); 
a[1].assign(&temp[3], &temp[5]); 
a[2].assign(&temp[5], &temp[7]); 
a[3].assign(&temp[7], &temp[8]); 
+0

這是非常脆弱的代碼。維護人員非常容易無意中將事情弄糟。 –

0

基本代碼如下所示。更快的備選方案可避免重複撥打back(),但這是查看與原始內容相關的最清晰的方式。

std::vector<std::vector<int>> a; 
a.push_back(std::vector<int>()); 
a.back().push_back(1); 
a.back().push_back(1); 
a.back().push_back(1); 
a.push_back(std::vector<int>()); 
a.back().push_back(1); 
a.back().push_back(2); 
a.push_back(std::vector<int>()); 
a.back().push_back(2); 
a.back().push_back(1); 
a.push_back(std::vector<int>()); 
a.back().push_back(3); 
return a; 
0

在C++ 03(或C++ 98)寫入維護的代碼的關鍵思想是名稱事。總的來說,這也是一個好主意,但它可能與理性簡潔的理想相沖突。也就是說,它可能很容易變得太冗長而完全無痛。

有了適當的支持,那麼可以寫代碼像

namespace my{ 
    using std::vector; 

    vector< vector<int> > 
     foo() 
    { 
     int const a0[] = {1,1,1}; 
     int const a1[] = {1,2}; 
     int const a2[] = {2,1}; 
     int const a3[] = {3}; 
     typedef cppx::Array_range<int const> R; 
     R const ranges[] = {a0, a1, a2, a3}; 
     return make_vecvec(ranges); 
    } 
} // namespace my 

相關支持:

#include <iostream> 
#include <stddef.h>  // ptrdiff_t 
#include <vector> 

namespace cppx { 
    using std::vector; 
    typedef ptrdiff_t Size; 
    typedef Size Index; 

    template< class Item, Size n > 
    Size n_items(Item (&)[n]) { return n; } 

    template< class Type > 
    struct Non_const{ typedef Type T; }; 

    template< class Type > 
    struct Non_const< Type const > { typedef Type T; }; 

    template< class Item > 
    struct Array_range 
    { 
     Item* const p_begin; 
     Item* const p_end; 

     template< Size n > 
     Array_range(Item (&a)[n]) 
      : p_begin(a) 
      , p_end(a + n) 
     {} 
    }; 

    template< class Item, Size n > 
    vector<typename Non_const<Item>::T> 
     make_vec(Item (&a)[n]) 
    { 
     return vector<typename Non_const<Item>::T>(a, a + n); 
    } 

    template< class Item, Size n > 
    vector< vector< typename Non_const<Item>::T > > 
     make_vecvec(Array_range<Item> const (&a)[n]) 
    { 
     typedef typename Non_const<Item>::T Nc_item; 
     vector< vector<Nc_item> > result; 
     for(Index i = 0; i < n; ++i) 
     { 
      result.push_back(vector<Nc_item>(
       a[i].p_begin, a[i].p_end 
       )); 
     } 
     return result; 
    } 
} // namespace cppx 

免責聲明:(1)我剛纔輸入此答案的支持代碼,固定直接const我偶然發現的問題。因此可能存在可重用性問題,但它顯示了總體思路(和它的工作原理)。 (2)我只用MinGW g ++(tdm64-1)5.1.0編譯它。