要使函数具有不定个数同类型的形参,要使用到c++11中新添加的模板类型:initializer_list.
其使用类似于Vevtor模板,,可以使用size()函数求出其元素数量,也有迭代器的操作,但与vector最大的不同是,initializer_list这个模板类中的元素永远是常量,无法对其进行修改
对于该模板的使用,我通过一个简单的例子来说明:
# include <iostream>
# include <string>
# include <initializer_list> //包含在同名头文件中
using namespace std;
void print(initializer_list<string>il); //假设其中类型为string
int main()
{
string a, b;
cin >> a >> b;
if (a != b)
{
print({ "hello", a, b });//其中传递的形参必须用中括号括起来,并用逗号隔开
}
else
{
print({ "hello","yes" });
}
system("pause");
return 0;
}
void print(initializer_list<string>il)
{
for (auto beg = il.begin(); beg != il.end(); beg++) //迭代器使用同vector
{
cout << *beg<< endl;
}
}
initializer_list提供的操作:
1.initializer_list<Datetyple>lst;尖括号中为数据类型,lst位置为其名
另一种初始化:initializer_list<Datetyple>lst{a,b,c,d};
2.lst1(lst2)或lst1=lst2: 但原始列表并不会拷贝到副本中,而是原始列表与副本共享元素
为方便理解,我先写一个简单的例子”
initializer_list<int>a={1,2,3,4,5}
initializer_list<int>b={7,8,9,10}
a=b;
for(auto c:a){
cout << c <<“ ";
}
上面代码运行的结果:
7,8,9,10
开始我也觉得摸不着头脑,在文章的开头我已经提到,initializer_list中的元素是常量,不可以改变。但上述代码中却是确确实实的改变了,不过后来想了一下,觉得可以这样理解,既然primer中将之与vector数组并提,也可以将之当作数组,上述代码中a,b可以当作数组的头指针来理解,所谓的拷贝,实际上只是将数组b的内存中的位置传给了a所以a最后指向了b所在的内存地址,所以只是共享而并非真的拷贝,但是倘若通过迭代器对其中的某一项元素进行修改则是非法的。
3.lst.size() 可以返回列表中元素的大小