繁体   English   中英

向量的初始化

[英]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个值,则可以通过以下方式对其进行初始化:

  1. std::vector<uint8_t> vect(arr, arr + 5000);

  2. std::vector<uint8_t> vect(std::begin(arr), std::end(arr));

  3. std::vector<uint8_t> vect(arr.begin(), arr.end()); 如果arr是std::array<uint8_t, 5000> ),则适用此方法

根据此答案 ,选项3优于选项1和2。最好使用容器的成员函数而不是非成员函数。

我总是看到c样式数组的第一个选择。 选项1是否与选项2完全相同? 其背后的微妙之处是什么?

谢谢你的帮助。

首选方法是将值直接放入向量中,而不是将它们放入数组中,然后使用它来初始化向量。

除此以外,使用自由函数std::beginstd::end的版本通常比其他版本更可取。 无论源是数组, std::vectorstd::array还是其他容器之一,例如std::liststd::set

后者显然在通用代码中最重要,因此它可以独立于源容器的类型。 但是,即使在其他情况下,对于几乎所有类型的输入都可以使用相同的语法,这使您可以将其识别为高级模式,这是一件事,因此您无需花费脑力来弄清楚它在做什么。

有两个明显的缺点:

  1. 您可能需要将代码可移植到较旧的编译器,而这些编译器没有将beginend作为自由函数实现。 我认为,最好的解决方法是在需要时自己实施(最少的努力)。
  2. 您有一个现有的代码库,该代码库大量使用container.begin()container.end() 修改现有的大型代码库以使用自由函数可能不切实际,并且将x.begin()begin(x)将无法提高可读性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM