2010-06-17 57 views
3

要創建一個字符串數組這個作品:創建和初始化一個向量數組去

std::string array[] = { 
    "first", 
    "second", 
    : 
    "last" 
}; 

如果我嘗試做相同的載體它不工作​​:

std::vector<int> array[] = { 
    {1, 2}, 
    {3, 4, 5} 
    : 
    {9} 
}; 

我得到「非聚合不能用初始化列表初始化」。

初始化向量數組的正確語法是什麼?

請注意,我需要這樣做,而不是使用向量成員函數來逐個填充向量(因爲我試圖設置一個文件來創建數組,基於初始化編號編譯時間,所以在這種情況下調用成員函數不起作用)。

回答

1

長話短說,它根本不被支持。有很多種解決方法可以獲得類似的語法(例如Boost :: assign),但是這些不會改變您在可執行文件中獲得的內容 - 它們只是調用成員函數比調用push_back的字符串要簡單一些。

1

也許這樣的事情會把你帶到你想要的方向嗎?

const int arr[] = { 1, 2, 3, 4, 5 }; 

std::vector v(arr, arr + sizeof(arr)/sizeof(*arr)); 
0

創建的矢量代碼

std::vector< std::vector<int> > v; 

調用默認沒有參數構造 創建的INT

int arry[] = {1,2,3,4,5}; 
std::vector<int> list(arry, arry + sizeof(arry)/sizeof(int)); 

一個簡單的矢量的矢量因而從整數數組 構成的矢量我建議你在方案中使用push_back()方法。

但是如果你只是想弄髒你可以按照上面提到的方式,創造std::vector<int>數組並把它傳遞給std::vector< std::vector<int> >

檢查http://www.cplusplus.com/reference/stl/vector/vector/構造瞭解更多信息 你可能有興趣在這個特定的構造過載template <class InputIterator> vector (InputIterator first, InputIterator last, const Allocator& = Allocator());

尼爾

2

雖然使用矢量的陣列的目的是非常有問題的(爲什麼不使用載體的載體或二維ARR ?唉話),做你想做正確的語法看起來像什麼:

std::vector<int> array[] = { 
    vector<int>(2), 
    vector<int>(3), 
    //... 
    vector<int>(1) 
}; 

它沒有任何意義的原因,是因爲在這種情況下,它的語義與創建指針數組:

int* array[] = { 
     new int[0], 
     new int[0], 
     //... 
     new int[0], 
    }; 

唯一的區別是內部std :: vector本身就是管理這些指針的生命週期。這意味着除非你創建一個恆定大小的向量(即沒有向量重新分配內部存儲器的可能性,如果你要麼聲明vector爲const或只是確保你不曾調用resize,reserve,push_back,insert,erase和其他類似的方法),你將有效地得到一個帶有指針的小對象數組。這是通常如何實現矢量的。

目前尚不清楚,在編譯時創建數組意味着什麼。以這樣的方式聲明數組你嘗試做,以及這些:

int fixed_size_array[100]; 

以這樣的方式的確創造,比在編譯時確定它們的大小。但是矢量是一個不同的野獸 - 這些是複雜的C++對象,它們在運行時動態地管理它們的內存,這意味着它們在設計時不能具有編譯時固定大小。