如何将 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.

中对此进行了很好的解释

Live

“附加”值可能意味着两件事 - 您想要 copy/duplicate 有问题的元素,或者您不需要它们在源容器中,也可能将它们移动到目标容器中。此外,区分在构造时插入与附加到现有的、已构造的容器是有意义的:如果可以,总是构造一个容器,其中包含它应该拥有的元素。

  1. Copy-append std::array 个元素添加到已构建的 std::vector:

    std::vector<T> dest;
    std::array<T, N> source;
    
    // ...
    
    dest.insert(dest.end(), source.cbegin(), source.cend());
    
  2. 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()));
    
  3. 复制 std::array 个元素到一个 std::vector 中构造:

    std::array<T, N> source;
    
    // ...
    
    std::vector<T> dest(source.cbegin(), source.cend());
    
  4. 在构造时将 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::movestd::copy(其中 std::copy 可与 std::move_iterators)。然而,这些不如直接调用 std::vector::insert 那样高效,因为前者在迭代器抽象上操作并一次处理 copy/move 一个元素,而不知道目标的存储细节(这可以导致多次调整缓冲区大小),而后者是一个 std::vector 成员函数,只会调整缓冲区大小一次(如果需要)。