c++调用函数需要不定个数同类型的形参方法

要使函数具有不定个数同类型的形参,要使用到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()  可以返回列表中元素的大小
 

发布了37 篇原创文章 · 获赞 12 · 访问量 9283

猜你喜欢

转载自blog.csdn.net/weixin_43265881/article/details/88381278