向量的初始化

Initializations of a vector

本文关键字:初始化 向量      更新时间:2023-10-16

我在 C++11 中看到了从数组(c 样式或 std::array)初始化向量的不同方法。假设我有一个这样的数组:uint8_t arr[5000]或像这样: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. 您可能需要将代码移植到未实现begin的旧编译器,并将end作为免费函数实现。在我看来,最好的治疗方法是在需要时自己实现它们(最少的努力)。
  2. 您有一个大量使用 container.begin()container.end() 的现有代码库。修改大型现有代码库以使用免费函数可能不切实际,并且混合使用x.begin()begin(x)将无助于可读性。