initializer_list对于未知数量的参数,实际的好处和目的是什么?为什么不直接使用vector并完成它?
事实上,它听起来只是vector另一个名字.何必?
我看到的唯一"好处" initializer_list是它有const元素,但这似乎不足以发明这种全新的类型.(const vector毕竟你可以使用.)
那么,我在做什么?
Naw*_*waz 37
它是程序员和编译器之间的一种契约.程序员说{1,2,3,4},编译器会创建一个类型的对象initializer_list<int>,其中包含相同的元素序列.此契约是语言规范对编译器实现强加的要求.
这意味着,不是程序员手动创建这样的对象,而是编译器创建对象,并将该对象传递给initializer_list<int>作为参数的函数.
该std::vector实现利用了这个契约,因此它定义了一个构造函数,它initializer_list<T>以参数的形式出现,因此它可以用initializer-list中的元素初始化它自己.
现在想了一会儿,该std::vector不具有任何需要的构造函数std::initializer_list<T>作为参数,那么你会得到这样的:
void f(std::initializer_list<int> const &items);
void g(std::vector<int> const &items);
f({1,2,3,4}); //okay
g({1,2,3,4}); //error (as per the assumption)
Run Code Online (Sandbox Code Playgroud)
按照假设,由于std::vector不具有构造函数std::initializer_list<T>作为参数,这意味着不能传递{1,2,3,4}作为参数以g()如上所示,因为编译器不能创建的一个实例std::vector进行的表达的{1,2,3,4} 直接.这是因为程序员和编译器之间没有这样的契约,并且由语言强加.它是通过 std::initializer_list,std::vector能够创造自己的表达{1,2,3,4}.
现在您将了解std::initializer_list可以在任何需要表达形式的地方使用{value1, value2, ...., valueN}.这就是为什么Standard库中的其他容器也定义了std::initializer_list作为参数的构造函数.通过这种方式,没有容器依赖于任何其他容器来构造形式的表达式{value1, value2, ...., valueN}.
希望有所帮助.
Pub*_*bby 17
好吧,std::vector 必须使用它initializer_list来获取语法,因为它显然无法使用它自己.
无论如何,initializer_list意图是非常轻量级.它可以使用最佳存储位置并防止不必要的副本.有了vector,你总是会获得堆分配并且很有可能获得比你想要的更多的副本/移动.
此外,语法有明显的差异.一个这样的事情是模板类型推导:
struct foo {
template<typename T>
foo(std::initializer_list<T>) {}
};
foo x{1,2,3}; // works
Run Code Online (Sandbox Code Playgroud)
vector 不会在这里工作.
And*_*owl 11
最大的优势initializer_list比vector是它允许你指定就地而不需要奉献的处理来创建列表元素的特定序列.
这样就可以避免设置多次调用push_back(或for循环)来初始化a,vector即使你确切知道哪些元素将被推入向量中.
实际上,vector它本身有一个构造函数接受initializer_list更方便的初始化.我会说这两个容器是互补的.
// v is constructed by passing an initializer_list in input
std::vector<std::string> v = {"hello", "cruel", "world"};
Run Code Online (Sandbox Code Playgroud)
当然,重要的是要意识到initializer_list确实存在一些限制(不允许缩小转换)的事实,这可能使得在某些情况下不适合或不可能使用.
| 归档时间: |
|
| 查看次数: |
12953 次 |
| 最近记录: |