向量的初始化

时间:2013-10-23 22:15:25

标签: c++ arrays c++11 vector

我在C ++ 11中看到了从数组(c-style或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>}

  4. ,则适用此项

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

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

    感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

除此之外,使用免费函数std::beginstd::end的版本通常比其他选项更受欢迎。无论源是数组std::vectorstd::array还是其他容器(例如std::liststd::set),它都可以使用。

后者在通用代码中显然是最重要的,因此它可以独立于源容器的类型。然而,即使在其他方面,能够对基本上所有类型的输入使用相同的语法,使得它可以被识别为高级模式,因此您不需要花费大脑周期来弄清楚它在做什么。

有两个明显的缺点:

  1. 您可能需要将代码移植到不使用beginend作为自由函数的旧编译器。在我看来,最好的解决方法是在需要时自己实施(尽量减少努力)。
  2. 您的现有代码库大量使用container.begin()container.end()。修改现有的大型代码库以使用免费功能可能并不实际,混合使用x.begin()begin(x)将无法提供可读性。