1

我在 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>)

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

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

谢谢你的帮助。

4

1 回答 1

2

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

除此之外,使用免费功能的版本std::begin通常std::end比替代品更可取。无论源是数组、std::vectorstd::array还是其他容器之一(例如std::list、 或),它都有效std::set

后者显然在泛型代码中最为重要,因此它可以独立于源容器的类型。然而,即使在其他情况下,能够对基本上所有类型的输入使用相同的语法,这使它成为您可以识别为高级模式的另一件事,因此您无需花费脑力周期来弄清楚它在做什么。

有两个明显的缺点:

  1. 您可能需要将代码移植到未实现的旧编译器beginend作为自由函数。在我看来,解决这个问题的最好方法是在需要时自己实施它们(最少的努力)。
  2. 您有一个大量使用container.begin()和的现有代码库container.end()。修改现有的大型代码库以使用免费功能可能不切实际,并且混合使用x.begin()begin(x)不会提高可读性。
于 2013-10-23T22:39:57.727 回答