我在C ++ 11中看到了从数组(c-style或std :: array)初始化向量的不同方法。
假设我有一个这样的数组:uint8_t arr[5000]
或者像这样: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>
}
根据this answer,选项3优于选项1和2.最好使用容器的成员函数而不是非成员函数。
我总是看到c风格数组的第一个选项。选项1是否与选项2完全相同?那背后的微妙之处是什么?
感谢您的帮助。
答案 0 :(得分:2)
首选方法是将值直接放入向量中,而不是将它们放入数组中,然后使用它来初始化向量。
除此之外,使用免费函数std::begin
和std::end
的版本通常比其他选项更受欢迎。无论源是数组std::vector
,std::array
还是其他容器(例如std::list
或std::set
),它都可以使用。
后者在通用代码中显然是最重要的,因此它可以独立于源容器的类型。然而,即使在其他方面,能够对基本上所有类型的输入使用相同的语法,使得它可以被识别为高级模式,因此您不需要花费大脑周期来弄清楚它在做什么。
有两个明显的缺点:
begin
和end
作为自由函数的旧编译器。在我看来,最好的解决方法是在需要时自己实施(尽量减少努力)。container.begin()
和container.end()
。修改现有的大型代码库以使用免费功能可能并不实际,混合使用x.begin()
和begin(x)
将无法提供可读性。