std::copy std::move

 

 

http://blog.sina.com.cn/s/blog_4cd2484f010099vt.html

如果要把一个序列(sequence)拷贝到一个容器(container)中去,通常用std::copy算法,代码如下:

std::copy(start, end, std::back_inserter(container));

 这里,start和end是输入序列(假设有N各元素)的迭代器(iterator),container是一个容器,该容器的接口包含函数push_back。假设container开始是空的,那么copy完毕后它就包含N个元素,并且顺序与原来队列中的元素顺序一样。标准库提供的back_inserter模板函数很方便,因为它为container返回一个back_insert_iterator迭代器,这样,复制的元素都被追加到container的末尾了。 

现在假设container开始非空(例如:container必须在循环中反复被使用好几次)。那么,要达到原来的目标,必须先调用clear函数然后才能插入新序列。这会导致旧的元素对象被析构,新添加进来的被构造。不仅如此,container自身使用的动态内存也会被释放然后又创建,就像list,map,set的节点。某些vector的实现在调用clear的时候甚至会释放所有内存。

 

通常,考虑到在一个已有的元素上直接copy覆盖更高效。keyi这样做:

std::copy(start, end, container.begin());

 在这里你在container的头部执行了copy-over(覆盖赋值)操作,但是,如果container的大小小于输入序列的长度N的话,这段代码会导致崩溃(crash)。

eg1:

   int a[3]={1,2,3};

   int b[3];
   std::copy(a,a+3,b);
  for(int j=0;j<3;j++)
    cout<< P>

eg2:

  vector temp(3);
 int a[3]={1,2,3};

 std::copy(a,a+3,&temp.front());
 cout<<<ENDL;
 for(int j=0;j
  cout<<<" ?;
copy只负责复制,不负责申请空间,所以复制前必须有足够的空间

 

 

https://www.cnblogs.com/xuhuajie/p/11491924.html

 

void fun(int T)

void fun(int* t)

oid fun(int& T)

void fun(int && T)

 

之前的参数,值传递,指针传递,引用传递。现在呢?多了一个叫 “右值引用”的玩意,多了一种参数类型的选择。仅此而已。

那他们号称的右值引用速度快,代价小呢?

 

https://blog.csdn.net/HelloZEX/article/details/89678298

转移线程所有权Move

 

td::thread是可移动的,不可拷贝。在std::thread对象之间转移线程所有权使用sd::move函数。

void some_function();
void some_other_function();
std::thread t1(some_function);           // 1
std::thread t2=std::move(t1);            // 2
t1=std::thread(some_other_function);     // 3 临时对象会隐式调用std::move转移线程所有权
std::thread t3;                          // 4
t3=std::move(t2);                        // 5
t1=std::move(t3);                        // 6 赋值操作将使程序崩溃
t1.detach();
t1=std::move(t3);                        // 7 ok

 

 

这里需要注意的是临时对象会隐式调用std::move转移线程所有权,所以t1=std::thread(some_other_function);不需要显示调用std::move。如果需要析构thread对象,必须等待join()返回或者是detach(),同样,如果需要转移线程所有权,必须要等待接受线程对象的执行函数完成,不能通过赋一个新值给std::thread对象的方式来"丢弃"一个线程。第6点中,t1仍然和some_other_function联系再一次,所以不能直接转交t3的所有权给t1。

std::thread支持移动,就意味着线程的所有权可以在函数外进行转移。

 

https://zhuanlan.zhihu.com/p/94588204

 

 

右值引用(&&),移动构造函数,移动复制运算符以及std::move

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值