通过初始化列表我的意思是{“something”,“like”,“this”}。我在网上看了,找不到任何这方面的例子。
DoublyLinkedList( std::initializer_list<T> & list)
{
for (auto T& f : list)
push_back(f);
}
答案 0 :(得分:3)
你可能意味着:
for (auto& f : list)
也代替std::initializer_list<T> &
(通过引用传递)使用std::initializer_list<T>
(按值传递),这样您就可以使用构造函数,如下所示:
DoublyLinkedList({1,2,3});
这是因为复制initializer_list不会复制底层元素数组。
答案 1 :(得分:2)
据我了解,您希望使用std::initializer_list
内传递的值初始化某个容器。在这种情况下,您只是在不修改它的情况下阅读list
- 所以当它传递给函数/方法(..( std::initializer_list<T> list)
)时不需要复制,也不需要传递它参考(..( std::initializer_list<T>& list)
)。而是通过常量引用(..( std::initializer_list<T> const& list)
)传递它,避免不必要的复制并防止其修改。
然后,当你在基于范围的for循环中遍历列表时,再次只需要读取元素。因此,您可以避免额外的副本(&
),也可以防止修改元素(const
)。顺便说一句,由于函数/方法声明中的参数修饰符,编译器会阻止对元素的修改。
auto
是类型说明符,表示将从其初始值设定项中自动推导出实际类型。您只需使用T
代替。
下面是推送到局部向量并返回推送元素数的简单示例。
template<typename T>
size_t DoublyLinkedList( std::initializer_list<T> const& list)
{
std::vector<T> vec;
for (auto const& element : list)
vec.push_back(element);
// if all you need is to initialize std container with the list:
// std::vector<T> vec(list);
return vec.size();
}
int main() {
cout << "# int elements pushed: " << DoublyLinkedList({1,2,3}) << endl;
cout << "# string elements pushed: " << DoublyLinkedList({"something", "like", "this"}) << endl;
return 0;
}
stdout:
推送#elements:3
推送#string元素:3