c++ 将列表中的几个元素移动到向量中

aydmsdu9  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(139)

我计划将列表中的一些元素移动到目标容器(比如vector)中进行进一步的处理。使用move_iterator将元素移动到目标容器中是否安全?使用erase将源容器中的 * 移动部分 * 移动到目标容器中是否安全?

#include<list>
#include<vector>
#include<iterator>
struct DataPoint {};
int main() {
    std::list<Datapoint> d_data; // source
    std::vector<Datapoint> v2;   // target
    v2.insert(v2.end(), 
              std::make_move_iterator(d_data.begin()), 
              std::make_move_iterator(d_data.begin() + size)
             );
    d_data.erase(d_data.begin(), d_data.begin() + size);  // safe? necessary?
    //...
    //d_batch->addData(v2);
    return 0;
}
xxb16uws

xxb16uws1#

您可能会发现std::move更容易使用。
是的,您确实需要删除源容器中移动的元素。
Demo(https://godbolt.org/z/bMdTxPfK1)

#include <algorithm>  // move
#include <fmt/ranges.h>
#include<list>
#include<vector>
#include<iterator>  // back_inserter

int main() {
    std::list<int> l{1, 2, 3, 4, 5};  // source
    std::vector<int> v;  // target
    auto begin_it{std::next(l.begin())};
    auto end_it{std::prev(l.end())};
    std::move(begin_it, end_it, std::back_inserter(v));
    fmt::print("l before erase: {}\n", l);
    l.erase(begin_it, end_it);
    fmt::print("l after erase: {}\nv: {}\n", l, v);
}

// Outputs:
//
//   l before erase: [1, 2, 3, 4, 5]
//   l after erase: [1, 5]
//   v: [2, 3, 4]
mbzjlibv

mbzjlibv2#

使用move_iterator移动到目标并擦除源容器的移动部分是否安全?
是的,两个都是真的,您可以从容器中移动对象,并且所有被移除的对象都将变为“有效但未指定的状态”。因此,如果您想重新使用它们,您可以分配新值并使用它。如果不需要,您可以安全地删除它们。

相关问题