如何将 auto 与初始值设定项列表一起使用push_back
How do I use auto with push_back with an initializerlist?
通过初始化程序列表,我的意思是{"某物","喜欢","这个"}。我在网上看了看,找不到任何这样的例子。
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
相关文章:
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 与引用一起使用的列表,在用作成员时更改行为
- 与lambda一起使用虚拟继承在初始化列表中捕获此问题的GCC错误
- 将[]运算符与链接列表一起使用
- 当将 getline 与 int 一起使用时,如何修复"没有重载函数 'getline' 的实例与参数列表匹配"
- 如何将重新绑定与自定义分配器和自定义列表一起使用
- 如何将 2 个链表合并或合并在一起以创建新列表
- 常量变量初始化仅与成员初始化列表一起工作
- 将initalizer列表与从空基类继承的结构一起使用
- 具有与专用列表一起使用的参数列表的超类方法<superclass>
- 为什么 auto 关键字不能与指向函数的指针的初始化列表一起使用?
- 如何将列表语法与默认精神一起使用
- 使初始化列表与 C++ 中的继承一起使用
- 将 clang 3.1 与初始值设定项列表一起使用
- 将BOOST_FOREACH与恒定的侵入性列表一起使用
- 如何将 auto 与初始值设定项列表一起使用push_back
- 如何使用与成员初始化器列表一起使用的static_assert
- 为什么我们不能在函数参数列表中将相同的dataype参数组合在一起?
- 将 GetLine 与 ifstream 一起使用 - 没有与参数列表匹配的"getline"实例
- boost DFS不能与set垂直列表一起工作