如何将 std::array 元素追加或插入到 std::vector 中?
How to append or insert std::array elements into a std::vector?
我对 C++ 比较陌生,我尝试做一些研究,但在网上搜索时,我主要遇到 C 数组而不是 std::array
。将 std::array 元素附加到 std::vector 以及将 std::array
元素插入 std::vector
的最有效方法是什么?我应该使用 std::copy
等 STL 函数吗?我目前正在使用 C++17、MinGW64。
要将现有数组(或一般的其他范围)的元素追加到向量中,您只需将向量的插入重载用于迭代器范围即可:
vector<int> vec{1, 2, 3};
array<int, 3> arr{4, 5, 6};
// arr could be some other container or bare array as well, for ex.:
// int arr[] = {4, 5, 6};
// vector<int> arr {4, 5, 6};
// list<int> arr {4, 5, 6};
// ...
vec.insert(vec.end(), begin(arr), end(arr)); // insert at vec.end() = append
//or vec.insert(vec.end(), arr.begin(), arr.end()); // insert at vec.end() = append
请注意,如果您有一些其他类型而不是 int
,复制起来很昂贵,并且您想要移动 元素 源数组,你可以使用
move_iterator
,例如
vec.insert(vec.end(), move_iterator(arr.begin()), move_iterator(arr.end()));
一般来说,对于范围的操作,容器成员函数是首选而不是 <algorithm>
header.
中的 same-named 函数
因此,例如在这种情况下,vec.insert
将立即插入范围,而如果使用 std::insert
则元素将被一个接一个地插入。
Scott Meyers Effective STL.
中对此进行了很好的解释
“附加”值可能意味着两件事 - 您想要 copy/duplicate 有问题的元素,或者您不需要它们在源容器中,也可能将它们移动到目标容器中。此外,区分在构造时插入与附加到现有的、已构造的容器是有意义的:如果可以,总是构造一个容器,其中包含它应该拥有的元素。
Copy-append std::array
个元素添加到已构建的 std::vector
:
std::vector<T> dest;
std::array<T, N> source;
// ...
dest.insert(dest.end(), source.cbegin(), source.cend());
Move-append std::array
个已构建的元素 std::vector
.
std::vector<T> dest;
std::array<T, N> source;
// ...
dest.insert(dest.end(), std::move_iterator(source.begin()),
std::move_iterator(source.end()));
复制 std::array
个元素到一个 std::vector
中构造:
std::array<T, N> source;
// ...
std::vector<T> dest(source.cbegin(), source.cend());
在构造时将 std::array
个元素移动到 std::vector
中:
std::array<T, N> source;
// ...
std::vector<T> dest(std::move_iterator(source.begin()),
std::move_iterator(source.cend()));
在谈论插入中间时,这里没有太多要补充的 - 唯一显着的区别是它总是效率较低,因为目标 std::vector
中的剩余元素将是 move-constructed(即 O(N))。
另请注意,对于追加元素,<algorithm>
header 中有 std::move
和 std::copy
(其中 std::copy
可与 std::move_iterator
s)。然而,这些不如直接调用 std::vector::insert
那样高效,因为前者在迭代器抽象上操作并一次处理 copy/move 一个元素,而不知道目标的存储细节(这可以导致多次调整缓冲区大小),而后者是一个 std::vector
成员函数,只会调整缓冲区大小一次(如果需要)。
我对 C++ 比较陌生,我尝试做一些研究,但在网上搜索时,我主要遇到 C 数组而不是 std::array
。将 std::array 元素附加到 std::vector 以及将 std::array
元素插入 std::vector
的最有效方法是什么?我应该使用 std::copy
等 STL 函数吗?我目前正在使用 C++17、MinGW64。
要将现有数组(或一般的其他范围)的元素追加到向量中,您只需将向量的插入重载用于迭代器范围即可:
vector<int> vec{1, 2, 3};
array<int, 3> arr{4, 5, 6};
// arr could be some other container or bare array as well, for ex.:
// int arr[] = {4, 5, 6};
// vector<int> arr {4, 5, 6};
// list<int> arr {4, 5, 6};
// ...
vec.insert(vec.end(), begin(arr), end(arr)); // insert at vec.end() = append
//or vec.insert(vec.end(), arr.begin(), arr.end()); // insert at vec.end() = append
请注意,如果您有一些其他类型而不是 int
,复制起来很昂贵,并且您想要移动 元素 源数组,你可以使用
move_iterator
,例如
vec.insert(vec.end(), move_iterator(arr.begin()), move_iterator(arr.end()));
一般来说,对于范围的操作,容器成员函数是首选而不是 <algorithm>
header.
因此,例如在这种情况下,vec.insert
将立即插入范围,而如果使用 std::insert
则元素将被一个接一个地插入。
Scott Meyers Effective STL.
中对此进行了很好的解释“附加”值可能意味着两件事 - 您想要 copy/duplicate 有问题的元素,或者您不需要它们在源容器中,也可能将它们移动到目标容器中。此外,区分在构造时插入与附加到现有的、已构造的容器是有意义的:如果可以,总是构造一个容器,其中包含它应该拥有的元素。
Copy-append
std::array
个元素添加到已构建的std::vector
:std::vector<T> dest; std::array<T, N> source; // ... dest.insert(dest.end(), source.cbegin(), source.cend());
Move-append
std::array
个已构建的元素std::vector
.std::vector<T> dest; std::array<T, N> source; // ... dest.insert(dest.end(), std::move_iterator(source.begin()), std::move_iterator(source.end()));
复制
std::array
个元素到一个std::vector
中构造:std::array<T, N> source; // ... std::vector<T> dest(source.cbegin(), source.cend());
在构造时将
std::array
个元素移动到std::vector
中:std::array<T, N> source; // ... std::vector<T> dest(std::move_iterator(source.begin()), std::move_iterator(source.cend()));
在谈论插入中间时,这里没有太多要补充的 - 唯一显着的区别是它总是效率较低,因为目标 std::vector
中的剩余元素将是 move-constructed(即 O(N))。
另请注意,对于追加元素,<algorithm>
header 中有 std::move
和 std::copy
(其中 std::copy
可与 std::move_iterator
s)。然而,这些不如直接调用 std::vector::insert
那样高效,因为前者在迭代器抽象上操作并一次处理 copy/move 一个元素,而不知道目标的存储细节(这可以导致多次调整缓冲区大小),而后者是一个 std::vector
成员函数,只会调整缓冲区大小一次(如果需要)。