Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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++ 单个向量元素上的移动语义_C++_Vector_Move Semantics - Fatal编程技术网

C++ 单个向量元素上的移动语义

C++ 单个向量元素上的移动语义,c++,vector,move-semantics,C++,Vector,Move Semantics,std::move在单个向量元素上的行为是什么? e、 g.(以下是经过简化的代码) 这会正确移动吗?我是否需要擦除()移动的元素 我通常使用复制构造函数和删除,在某些情况下编译器会优化移动(合成)而不是使用复制构造函数吗 我尝试使用智能指针包装器,但没有看到明显的加速。 移动语义看起来像我想要使用的 template< class T > class Foo { }; vector< Foo< T > > v1, v2; v2.emplace_back(

std::move
在单个向量元素上的行为是什么? e、 g.(以下是经过简化的代码)

这会正确移动吗?我是否需要
擦除()
移动的元素

我通常使用复制构造函数和删除,在某些情况下编译器会优化移动(合成)而不是使用复制构造函数吗

我尝试使用智能指针包装器,但没有看到明显的加速。 移动语义看起来像我想要使用的

template< class T >
class Foo
{
};

vector< Foo< T > > v1, v2;

v2.emplace_back( std::move( v1[ 2 ] );
模板
福班
{
};
向量v1,v2;
v2.向后安放(标准::移动(v1[2]);
我没有看到使用移动操作的显著加速,我认为我已经正确地实现了移动构造函数和移动赋值操作符


请解释一下这个问题。

我们有两项工作:

  • 指示资源的所有权(例如一些分配的内存、文件*指针或流)已易手
  • 在上述情况下,避免不必要的副本
例如,假设我们有一个向量:

vector<int> a; 
for(int i = 0; i < 10000; i++) { 
    a.push_back(i); 
}
a
中的所有元素都不会被复制,这会加快速度。但是,
a
不再拥有这些元素。我们可以使用以下代码演示:

#include <vector>
#include <iostream>

int main() {
    using std::vector;

    vector<int> a = {1, 2, 3};
    vector<int> b = std::move(a); 
    if(a.data() == nullptr) // This should be true now
        std::cout << "a.data() is null now\n"; 
    if(a.size() == 0)
        std::cout << "a.size() is zero now\n"; 
}
即使您有包装器类,这也适用:

#include <vector>
#include <iostream>

template<class T>
class Wrapper {
   public:
    // Because all the members of Wrapper are public,
    // the compiler automatically generates move and copy constructors
    T value; 
};


int main() {
    using std::vector;

    Wrapper<vector<int>> a = {{1, 2, 3}};
    Wrapper<vector<int>> b = std::move(a); 
    // Same output as before
    if(a.value.data() == nullptr)
        std::cout << "a.data() is null now\n"; 
    if(a.value.size() == 0)
        std::cout << "a.size() is zero now\n"; 
}
#包括
#包括
模板
类包装器{
公众:
//因为包装器的所有成员都是公共的,
//编译器自动生成移动和复制构造函数
T值;
};
int main(){
使用std::vector;
包装器a={{1,2,3};
包装b=标准::移动(a);
//输出与以前相同
if(a.value.data()==nullptr)

std::cout“我看不到显著的加速”-如果不提供什么是测试用例、什么是硬件、什么是编译器以及什么是编译设置(即编译器标志),这是一条毫无意义的语句。您可以从vector中移动元素。如果移动标准库对象,它将最终处于有效但未指定的状态,这使您能够仅执行y不需要先决条件的操作(在大多数情况下,您只能将其删除或分配给它).
class Foo
没有数据成员,因此移动和复制之间没有区别。请提供一个真实的。移动语义在您向我们展示的代码中是不相关的。这个问题让我感到奇怪的是,它非常具体。为什么您认为向量元素与任何其他命名变量在
std::move
方面不同?Foo类不包含数据成员。没有可移动的内容。性能将与没有可复制内容时相同。
#include <vector>
#include <iostream>

int main() {
    using std::vector;

    vector<int> a = {1, 2, 3};
    vector<int> b = std::move(a); 
    if(a.data() == nullptr) // This should be true now
        std::cout << "a.data() is null now\n"; 
    if(a.size() == 0)
        std::cout << "a.size() is zero now\n"; 
}
a.data() is null now
a.size() is zero now
#include <vector>
#include <iostream>

template<class T>
class Wrapper {
   public:
    // Because all the members of Wrapper are public,
    // the compiler automatically generates move and copy constructors
    T value; 
};


int main() {
    using std::vector;

    Wrapper<vector<int>> a = {{1, 2, 3}};
    Wrapper<vector<int>> b = std::move(a); 
    // Same output as before
    if(a.value.data() == nullptr)
        std::cout << "a.data() is null now\n"; 
    if(a.value.size() == 0)
        std::cout << "a.size() is zero now\n"; 
}