pfn*_*sel 10 c++ initialization vector initializer-list c++11
在C++ 11中,可以使用初始化列表来初始化函数中的参数.它的目的是什么?使用const向量不能做同样的事情吗?以下两个程序有什么区别?
使用初始化列表:
#include <iostream>
using namespace std;
int sumL(initializer_list<int> l){
int sum = 0;
for (const auto i: l){
sum += i;
}
return sum;
}
int main(){
cout << sumL({1, 2, 3}) << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用const向量:
#include <iostream>
#include <vector>
using namespace std;
int sumV(const vector<int> l){
int sum = 0;
for (const auto i: l){
sum += i;
}
return sum;
}
int main(){
cout << sumV({1, 2, 3}) << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Wal*_*ter 10
常见的用途std::initializer_list是作为容器(和类似)类的构造函数的参数,允许从相同类型的几个对象方便地初始化这些容器.当然,您可以使用std::initializer_list其他方式然后使用相同的{}语法.
由于a std::initializer_list具有固定的大小,因此不需要动态分配,因此可以有效地实现.甲std::vector,在另一方面,需要动态存储器分配.即使在您的简单示例中,编译器也不太可能优化此开销(避免中间设备std::vector及其动态内存分配).除此之外,程序的结果没有区别(尽管你应该采取一个const std::vector<int>&参数来避免副本及其相关的动态内存分配).
initalizer_list 不是像 std::vector 这样的通用容器。它的主要目的是对象初始化。如果听到的低和没有堆分配对您有吸引力,我建议您查看 std::array。它是一个固定大小的堆栈分配数组,具有 STL 容器的所有便利,它本质上是一个 C 数组顶部的薄包装。
两者的语义完全不同。该initializer_list具有指针语义,而vector值语义的。
在您的第一个示例中,编译器将生成类似于以下内容的代码:
int const __temp_array[3] = {1, 2, 3};
cout << sumL(std::initializer_list<int>(__temp_array, __temp_array + 3)) << "\n";
Run Code Online (Sandbox Code Playgroud)
这在[dcl.init.list]/5 中有解释。如您所见,sumL您可以访问const指向支撑初始化列表元素的指针,这意味着您别无选择,只能从列表中复制元素。
如果sumV您可以std::moved从vectorif 需要的元素(假设参数类型不是const)。
类似地,复制initializer_list执行浅拷贝,即只复制指针,而复制vector,当然意味着将复制元素。
在您的示例中,除了构建vectorwill 需要动态内存分配而构建initializer_listwill之外,上述所有要点都没有任何区别。
| 归档时间: |
|
| 查看次数: |
4939 次 |
| 最近记录: |