介绍
C+ + 03初始化是前后矛盾。例如,它不让你初始化POD数组 是类成员和圆荚体阵列使用新分配。c++的限制规则变得更明显03初始化时,你需要初始化一个容器对象填充。通常,你要强迫自己用的是一种笨重的回路作为一个解决办法:
std::vector<int> vi;
for (int i=0; i<3; i++)
vi.push_back(i);
这是低效率的,而且很不方便。
幸运的是,C + + 0 x标准修改规定初始化。C + + 0 x几乎会让你每一个对象初始化,包括STL容器,使用括号符号= {…}。在接下来的段落里,我将向你展示如何使用C + + 0 x初始化的符号初始化对象的数组,动态分配的数组与STL容器。我要检查这种现象的潜在机制,使容器支撑的初始化的二个数字滴答响。
class A
{
int a;
int b;
public:
A(int k, int l): k(a), l(b) {}
};
在c++中,你使用03以下句法:A a(0,0);
在C + + 0 x你也可以使用braces 来达到相同的效果。
A b ={0,0}; //allowed only in C++0x
那些有数组的类被证明是一个严重的问题在C + + 03到初始化有关
class D
{
int n[3];
public:
D() {n[0]=0; n[1]=1; n[2]=2;} //tedious
};
同样的,现在能初始化容器
在C + + 03中,你会典型的“初始化“容器有环()重复push_back调用:
<code> std::vector<int> vi; for (int i=0; i<3; i++) vi.push_back(i); </code>
够初始这是低效率的,而且很不方便。它的时间投标。
循环象上图再见。下面是C++ 03你如何初始化向量在化一个动态数组
//C++0x only
std::vector<int> vi={0,1,2};
std::vector<double> vd={0.,1.5,2.99};
同样地,初始化map从来都不容易。
map<string, string> VIP_agents_phonebook = //C++0x only
{ {"Black Eyes Peas", "+1 (212) 567-8900"},
{"Beyonce", "+1 (212) 555-0987"}};
它是如何工作的
不要让支撑符号误导你。当你初始化一个向量像这样:
std::vector<int> vi={0,1,2};
编译器默默地扭转了这个代码分成构造的调用。. 构造函数初始化,vi在运行时间。C + + 0 x标准库提供它现在容器(和其他几个标准模板类如)与人们所知一个序列的构造器。构造函数是一个序列将单一参数的类型:initializer_list。:这里的一个例子,有一个序列的构造函数。
class E
{
//accept a variable no of int's as initializer
E(initializer_list<int>);
};
//usage
E prime_list={2,3,5,7,11};
E another_prime_list={13,17};
构造函数的初始化一个序列让你任意数量的对象构造者被视为一种初始化器list:initializer_list < T >是一个标准模板类中定义的新的标题< initializer_list >。例如:initializer_list序列的构造转换成一个数组类型T T[n](在n的实际数量封闭在括号内构造)和使用该数组来初始化它的客体。
类模板的initializer_list有三个成员函数,这些函数的授权访问构造的序列。
template<class D> class initializer_list
{
//implementation (pair of pointers or pointer + length)
public:
//constructors
initializer_list(const D*, const D*); // [first,last)
initializer_list(const D*, int); //[first, first+length)
//access to the sequence
int size() const; // no of elements
const D* begin() const; // first element
const D* end() const; // one-past-the-last element
};
序列:向量构造的性病可能看起来像这样:
template<class T> class vector
{
T* elem;
size_t n;
public:
vector (initializer_list<T> seq) //sequence ctor
{
n= seq.size();
reserve(n);//allocate space for n elements
//copy the initializers into the vector
uninitialized_copy(seq.begin(), seq.end(), elem);
}
// ... the rest as before
};
结论
.目前,一些编译器(包括GCC 4.4)支持STL容器初始目录。A在最近的最后委员会批准在匹兹堡会议草案在2010年3月,其他供应商有望实现统一的符号以及初始化器初始化列表很快。