通过初始化程序列表,我的意思是{"某物","喜欢","这个"}。我在网上看了看,找不到任何这样的例子。
DoublyLinkedList( std::initializer_list<T> & list)
{
for (auto T& f : list)
push_back(f);
}
你可能的意思是:
for (auto& f : list)
此外,使用std::initializer_list<T>
(按值传递)代替std::initializer_list<T> &
(按引用传递),这样您就可以按如下方式使用构造函数:
DoublyLinkedList({1,2,3});
这是因为复制initializer_list不会复制元素的底层数组。
据我了解,您想使用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;
}
标准输出:
# 推送元素:3
# 推送的字符串元素:3