2011-03-13 87 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