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