initializer_list是C++11提供的新数据类型,和vector一样,initializer_list也是一种模板类型。可以使用.begin(), .end() 等方法。
因为C++11扩大了初始化列表的适用范围,使其可用于所有内置类型和用户定义的类型。使用初始化列表时,可添加=等于号,也可不添加。
int a={0} ;
int b{0} ;
vector<int> v = { 1, 2, 3, 4 } ;
vector<int> v{ 1, 2, 3, 4} ;
由此可见,initializer_list 还有一种用法是在构造函数或者其他函数中作为参数输入。能够简化一些操作。两个小例子:
第一个例子是在类中的构造函数中接收初始化列表。
class MyNumber{
public:
MyNumber(const std::initializer_list<int> &v) {
for (auto itm : v) {
mVec.push_back(itm);
}
}
void print() {
for (auto itm : mVec) {
std::cout << itm << " ";
}
}
private:
std::vector<int> mVec;
};
int main(){
MyNumber m = { 1, 2, 3, 4 };
m.print(); // 1 2 3 4
return 0;
}
第二个例子是在普通函数中接受初始化列表。
#include<iostream>
#include<initializer_list>
using namespace std;
double sum(initializer_list<double> il);
double average(const initializer_list<double> &ril);
double sum(initializer_list<double> il){
double sum = 0;
for (auto tmp : il) sum += tmp;
return sum;
}
double average(const initializer_list<double> &ril){
if (ril.size() > 0){
double sum = 0;
for (auto tmp : ril) sum += tmp;
return sum / ril.size();
}
return 0.0;
}
int main(){
cout << "sum:" << sum({ 2, 3, 4 }) << ", ave:" << average({ 2.0, 3, 4 }) << endl;
initializer_list<double> dl = { 1.5, 2.5, 3.5, 4.5, 5.5 };
cout << "sum:" << sum(dl) << ", ave:" << average(dl) << endl;
dl = { 1, 2, 3, 4, 5, 6 };
cout << "sum:" << sum(dl) << ", ave:" << average(dl) << endl;
system("pause");
}