2011-03-13 85 views
3

我們可以使用下面的語法來初始化一個向量。如何用顯式元素初始化程序初始化矢量?

// assume that UserType has a default constructor 
vector<UserType> vecCollections; 

現在,如果用戶類型不提供用戶類型默認的構造函數,但只有一個構造函數如下:

explicit UserType::UserType(int i) { ... }. 

我應該如何調用帶有矢量構造這個外在因素的初始化?

+0

+1的問題,因爲它讓我寫一個初始化,這是我最終喜歡:d – Nawaz 2011-03-13 19:00:29

回答

10
vector<UserType> vecCollections(10, UserType(2)); 
+0

這正是我需要的: ) - 謝謝 – q0987 2011-03-13 18:12:04

4

不幸的是,當前C++(C++ 03)沒有辦法用任意元素初始化向量。你可以使用@ Erik的答案中的同一個元素來初始化它。

但是在C++ 0x中,你可以這樣做。這就是所謂的initializer_list

vector<UserType> vecCollections({UserType(1), UserType(5), UserType(10)}); 

順便說一句,你可能要檢查出boost::assign庫,它是分配給一個載體和其它容器很語法方便的方式

+0

即使在C++ 03中,也可以用任意類型初始化向量!看我的解決方案! – Nawaz 2011-03-13 19:15:56

+0

@Nawaz:我認爲這是提升分配的解決方案:) – 2011-03-13 22:47:32

+0

我不知道。 – Nawaz 2011-03-13 23:09:52

4
std::vector<char> items(10, 'A'); //initialize all 10 elements with 'A' 

但是,如果想用不同的值初始化矢量,那麼你可以編寫一個通用的矢量初始值設定器類模板,並且無處不在:

template<typename T> 
struct initializer 
{ 
    std::vector<T> items; 
    initializer(const T & item) { items.push_back(item); } 
    initializer& operator()(const T & item) 
    { 
     items.push_back(item); 
     return *this; 
    } 
    operator std::vector<T>&() { return items ; } 
}; 

int main() { 
     std::vector<int> items(initializer<int>(1)(2)(3)(4)(5)); 
     for (size_t i = 0 ; i < items.size() ; i++) 
      std::cout << items[i] << std::endl; 
     return 0; 
} 

輸出:

1 
2 
3 
4 
5 

演示在ideone:http://ideone.com/9dODD

+0

+1我相信[boost :: assign :: list_of](http://www.boost.org/doc/libs/1_46_1/libs/assign/doc/index.html#list_of)也是這樣。 – 2011-03-13 20:29:24

+0

爲什麼不重載命令運算符,它看起來會更好。 – 2011-03-13 23:04:19

+0

@sonicoder:什麼是命令操作符? – Nawaz 2011-03-14 03:25:41