向量的初始化
Initializations of a vector
我在 C++11 中看到了从数组(c 样式或 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>
,则此应用适用
根据这个答案,选项 3 比选项 1 和 2 更好。最好使用容器的成员函数,而不是非成员函数。
我总是看到 c 样式数组的第一个选项。选项 1 是否与选项 2 完全相同?这背后的微妙之处是什么?
感谢您的帮助。
首选方法是将值直接放入向量中,而不是将它们放入数组中,然后使用它来初始化向量。
除此之外,使用自由函数的版本通常比替代方案更可取std::begin
和std::end
。无论源是数组、std::vector
、std::array
,还是其他容器之一,如std::list
或std::set
,它都有效。
后者在泛型代码中显然是最重要的,因此它可以独立于源容器的类型。然而,即使不是这样,能够对基本上所有类型的输入使用相同的语法,使它成为你可以识别为高级模式的另一件事,所以你不需要花费大脑周期来弄清楚它在做什么。
有两个明显的缺点:
- 您可能需要将代码移植到未实现
begin
的旧编译器,并将end
作为免费函数实现。在我看来,最好的治疗方法是在需要时自己实现它们(最少的努力)。 - 您有一个大量使用
container.begin()
和container.end()
的现有代码库。修改大型现有代码库以使用免费函数可能不切实际,并且混合使用x.begin()
和begin(x)
将无助于可读性。
- 如何使用C++初始化向量;脚本化值不是数组、指针或矢量错误
- 在C++中初始化向量映射的最有效方法
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 用向量的向量元素初始化向量的空向量
- 初始化向量数组,其中每个向量的大小为 0
- 如何初始化向量<unordered_map<*,*>>
- 如何在元组初始化向量中删除样板?
- C++ 通过函数声明后初始化向量
- 特征::向量;在函数中使用 Eigen::Matrix3f 的值初始化向量,大于 4 个条目
- 使用所述填充构造函数初始化向量中的向量
- 制作可用于初始化向量的迭代器
- 如何使用sregex_token_iterator对象初始化向量
- 用空向量 c++ 的 M 元素初始化向量
- 用reference_wrapper本地初始化向量
- 将向量元素与字符串元素进行比较,而不初始化向量
- 使用 reference_wrappers 初始化向量
- 从不同类型的容器的迭代器初始化向量
- 在具有容量/调整大小的类中初始化向量
- 在头文件中声明和初始化向量
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量