initializer_list

208 阅读1分钟

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");
}