gpt4 book ai didi

c++ - 是否有利用 move 的 back_inserter 变体?

转载 作者:行者123 更新时间:2023-12-01 01:42:57 24 4
gpt4 key购买 nike

在通用代码中,我试图告诉输出迭代器(实际上是 std::back_inserter_iterator move 一系列元素。令我惊讶的是,它看起来好像元素是在 move-to-back_inserter 操作中 move 的。

#include<algorithm> // move
#include<iterator> // back_inserter
#include<vector>
int main(){
std::vector<std::vector<double> > v(10, std::vector<double>(100));
std::vector<std::vector<double> > w;

assert( not v[0].empty() and w.size() == 0 );
std::copy(v.begin(), v.end(), std::back_inserter(w));
assert( not v[0].empty() and w.size() == 10 );

std::move(v.begin(), v.end(), std::back_inserter(w));
assert( v[0].empty() and w.size() == 20 ); // were v elements moved to w?
}

但是我认为 v 的元素是不可能的真的被感动到 w ,因为毕竟 back_inserter会做 push_back这意味着复制到 w .

似乎更有可能在 std::move案例, v元素被 move 到一个临时的,然后才被复制到 w .

那是对的吗?有没有std::back_inserter真的以某种方式 move 吗?

是否已经有 std::back_inserter 的变体这利用了 move/安置? 类似于 std::back_emplacer ?

最佳答案

std::back_insert_iterator除了打电话之外什么都不做push_back在正在构建的容器上,可以通过查看 std::vector::push_back 来回答问题。过载集:

void push_back(const T& value);
void push_back(T&& value);

所以,在这里我们显然有一个右值引用的重载。如果对应的 std::back_insert_iterator会不会很奇怪使用右值引用调用时复制其参数?事实上,我们再次有一个非常相似的 overload set :
back_insert_iterator<Container>&
operator=(typename Container::const_reference value);
back_insert_iterator<Container>&
operator=(const typename Container::value_type& value);

附加的评论是

1) Results in container->push_back(value)
2) Results in container->push_back(std::move(value))



回到你原来的问题

Is there a std::back_inserter really moving somehow?



是的,这个函数创建的迭代器确实利用了右值引用参数。

Is there already a variant of std::back_inserter that takes advantage of move/emplace?



不可以,但可以实现。见 this answer .

关于c++ - 是否有利用 move 的 back_inserter 变体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54303852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com