Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在STL容器内转移所有权?_C++_Stl_Ownership - Fatal编程技术网

C++ 在STL容器内转移所有权?

C++ 在STL容器内转移所有权?,c++,stl,ownership,C++,Stl,Ownership,是否可以将向量内容的所有权从一个向量转移到另一个向量 vector<T> v1; // fill v1 vector<T> v2 = OvertakeContents(v1); // now v1 would be empty and v2 would have all the contents of v1 向量v1; //填充v1 向量v2=向量(v1); //现在v1将为空,v2将包含v1的所有内容 可用于具有拼接功能的列表。 对于整个向量,这在恒定时间内也是可

是否可以将向量内容的所有权从一个向量转移到另一个向量

vector<T> v1; 
// fill v1
vector<T> v2 = OvertakeContents(v1);
// now v1 would be empty and v2 would have all the contents of v1
向量v1;
//填充v1
向量v2=向量(v1);
//现在v1将为空,v2将包含v1的所有内容
可用于具有拼接功能的列表。 对于整个向量,这在恒定时间内也是可能的

如果不是,为什么不呢?

请查看std::swap

vector<T> v1; 
// fill v1

vector<T> v2;

swap(v1, v2);
OR
v2.swap(v1);
向量v1;
//填充v1
矢量v2;
互换(v1,v2);
或
v2.互换(v1);
std::vector有一个swap()函数,其工作原理与此类似

vector<T> v2;
v2.swap(v1);
vectorv2;
v2.互换(v1);

这里有两点:

1) 对于任何可分配类型,可以根据分配定义交换。这需要三个指定,对于容器类型,每个指定在容器大小上都是线性的。那么,从某种意义上说,a.swap(b)是多余的。它的存在完全是为了提高效率:对于许多容器,如vector和list,可以实现swap,使其运行时复杂性保持不变而不是线性。如果某些容器类型X可以这样做,那么模板专门化交换(X&,X&)可以简单地用X::swap(X&)编写。这意味着X::swap(X&)只有在存在此类恒定时间实现的情况下才应该定义。不是每个容器类X都需要这样一个成员函数,但是如果成员函数存在,那么它就保证在固定时间内摊销

2) 如果您需要另一个容器,其中包含与您要传输的元素相同的元素
所有权请创建一个简单的副本以提高效率

我几乎超过了您,但是,您的代码在语法上是错误的。您的注释完全错误:所有STL容器都提供了与a.swap(b)@Greg具有相同语义的std::swap(a,b)的等效重载。谢谢你指出我笔记中的错误。在查看Vector.swap的引用时,它们确实具有相同的语义。但我想补充一点,在C++0x中,您可以简单地将“内容”替换为“std::move”,它将执行您想要的操作。