[英]Initializations of a vector
我看到了从C ++ 11中的数组(C样式或std :: array)初始化向量的不同方法。 假设我有一个这样的数组: uint8_t arr[5000]
或这样的std::array<uint8_t, 5000> arr;
: std::array<uint8_t, 5000> arr;
举个例子。
如果我想从arr中获得5000个值,则可以通过以下方式对其进行初始化:
std::vector<uint8_t> vect(arr, arr + 5000);
std::vector<uint8_t> vect(std::begin(arr), std::end(arr));
std::vector<uint8_t> vect(arr.begin(), arr.end());
如果arr是std::array<uint8_t, 5000>
),则适用此方法
根据此答案 ,选项3优于选项1和2。最好使用容器的成员函数而不是非成员函数。
我总是看到c样式数组的第一个选择。 选项1是否与选项2完全相同? 其背后的微妙之处是什么?
谢谢你的帮助。
首选方法是将值直接放入向量中,而不是将它们放入数组中,然后使用它来初始化向量。
除此以外,使用自由函数std::begin
和std::end
的版本通常比其他版本更可取。 无论源是数组, std::vector
, std::array
还是其他容器之一,例如std::list
或std::set
。
后者显然在通用代码中最重要,因此它可以独立于源容器的类型。 但是,即使在其他情况下,对于几乎所有类型的输入都可以使用相同的语法,这使您可以将其识别为高级模式,这是一件事,因此您无需花费脑力来弄清楚它在做什么。
有两个明显的缺点:
begin
和end
作为自由函数实现。 我认为,最好的解决方法是在需要时自己实施(最少的努力)。 container.begin()
和container.end()
。 修改现有的大型代码库以使用自由函数可能不切实际,并且将x.begin()
和begin(x)
将无法提高可读性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.