我目前的任务是为教授提供给我们的特殊自定义课程创建一个定义;我从未见过使用过initializer_list,我的教授也没有看过它。它到底是做什么的?
template<class T>
LinkedQueue<T>::LinkedQueue(const std::initializer_list<T>& il) {
}
我必须定义构造函数,我将自己完成。我只是想知道这个参数是做什么的。此外,我的编译器一直告诉我找不到std :: initializer_list成员声明。我使用#include导入了它,但问题仍然存在。
答案 0 :(得分:2)
它允许您使用{}初始化您的LinkedQueue。 如在
LinkedQueue<char> theQueue = {'a','b','c','d','e','f','g','h' };
以及其他内容,详细信息here在关于它及其使用的网页上。
答案 1 :(得分:2)
std::initializer_list
是一个类模板,它包含一系列初始化器,它具有非常小的接口,因为它的唯一目的是用于使用它包含的值序列初始化另一个对象。与std::vector
或std::deque
不同,std::initializer_list
不能用作通用容器。
当有人尝试列出初始化LinkedQueue<T>::LinkedQueue(const std::initializer_list<T>&)
时会调用函数LinkedQueue<T>
,如下所示:
LinkedQueue<int> q {1, 2, 3};
该语言自动构造一个std::initializer_list<int>
对象,该对象按顺序包含值1,2,3。该对象被传递给构造函数。构造函数返回后,用户希望新构造的LinkedQueue<int>
对象按顺序包含值1,2,3。
您需要编写构造函数,以使其成立。为此,您可以使用基于范围的for循环遍历std::initializer_list<T>
对象,并按顺序将值添加到列表中。假设你有一个push_back
函数和一个有效的默认构造函数,那么这样的东西可能有用:
template<class T>
LinkedQueue<T>::LinkedQueue(const std::initializer_list<T>& il): LinkedQueue() {
for (const T& val : il) {
push_back(val);
}
}
这将委托默认构造函数来设置类不变量,然后按顺序插入给定的初始值设定项。
答案 2 :(得分:1)
在C ++ 11中,初始化列表是一种在需要多个文字时为对象分配内容的方法。
例如,您可以初始化如下列表:
std::list<int> myList{1,2,3,4,5};
您可以编写您的类,因此它接受这样的语法。
作为极简主义示例,以下函数接受初始化列表:
void func( initializer_list<int> intList)
{
for (auto i: intList) /*whatever*/;
}
// used as:
func({1,2,3,5});
初始化必须属于同一类型:您不能在初始化列表中混合使用不同类型的值。