将列表的对象C++移动到另一个对象
Moving object of lists in C++ to another object
我试图理解这段代码是如何工作的。
// Example program
#include <iostream>
#include <string>
#include <list>
struct complex
{
int n;
std::string str;
complex(int n): n(n), str("String form " + std::to_string(n)) {}
};
struct Node
{
Node(){std::cout<<"creating objn";}
Node(const Node &a){ll = a.ll; pll = a.pll;}
Node(Node &&a){ll = std::move(a.ll); pll = std::move(a.pll);}
Node& operator=(const Node &a){ll = a.ll; pll = a.pll; return *this;}
Node& operator=(Node &&a){ll = std::move(a.ll); pll = std::move(a.pll); return *this;}
~Node()
{
std::cout<<"Destroying objectn";
for(auto iter : ll)
{
iter = 0;
}
for(auto iter : pll)
{
delete(iter);
iter = nullptr;
}
}
std::list<int> ll;
std::list<complex*> pll;
};
Node CreateNode()
{
Node n;
n.ll.push_back(1);
n.ll.push_back(2);
n.ll.push_back(3);
n.ll.push_back(4);
n.ll.push_back(5);
n.ll.push_back(6);
n.ll.push_back(7);
n.pll.push_back(new complex(11));
n.pll.push_back(new complex(21));
n.pll.push_back(new complex(31));
n.pll.push_back(new complex(41));
n.pll.push_back(new complex(51));
n.pll.push_back(new complex(61));
n.pll.push_back(new complex(71));
return std::move(n);
}
int main()
{
Node m;
std::cout<<"Before assigning Nodesn";
for(auto iter : m.ll)
{
std::cout<<iter<<" ";
}
std::cout<<"n";
for(auto iter : m.pll)
{
std::cout<<iter->n<<", "<<iter->str<<" --> ";
}
std::cout<<"n";
m = CreateNode();
std::cout<<"After assigning Nodesn";
for(auto iter : m.ll)
{
std::cout<<iter<<" ";
}
std::cout<<"n";
for(auto iter : m.pll)
{
std::cout<<iter->n<<", "<<iter->str<<" --> ";
}
std::cout<<"n";
return 0;
}
在复制构造函数或复制赋值运算符中,我只是传递具有离散内存分配的列表。在我的移动语义中只传递a.pll怎么可能将整个内存移动到下一个对象?我希望我需要遍历每个列表对象,然后移动它们。
但是没有。它只是像魔术一样工作,只需将a.pll移动到其他对象即可。内部情况如何?
您可以在此处看到此操作: https://repl.it/repls/WildComfortableLesson
那是因为std::list
为您实现了移动分配。
顺便说一下,可以使用初始值设定项列表对移动构造函数进行一些改进:
Node(Node&& n) : ll{std::move(n.ll)}, pll{std::move(n.pll)} {}
这将移动构造两个列表(使用std::list
的移动构造函数(,而不是默认构造,然后移动分配它们。复制构造函数也是如此。
我看到正在制作一个包含两个空列表的Node m
。列表 1 包含整数 列表 2 包含一个 int 和字符串。然后,当您调用函数 CreateNode 时,它只是遍历空节点并逐个分配值(请参阅创建节点函数((本可以为此使用循环,但在此实现中它们只是逐个推送(同一件事((。然后他们打印值。
我希望这有助于欢呼。
相关文章:
- 将对象移动到std::shared_ptr
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 如何将"this"的生命周期移动到C++中的另一个对象中?
- 基于范围的 for 循环将对象移动到另一个容器中?
- 将列表的对象C++移动到另一个对象
- 在C++中将对象从一个向量移动到另一个向量(LEMON 库)
- 将对象从一个unique_ptr移动到另一个C++
- 在将对象移动到另一个线程后,不能简单地删除该对象
- 在OpenGL中将2D对象移动到一个点
- 如何返回一个不可移动(但可复制)的对象
- 在地图中构造一个不可移动的对象
- 在堆栈程序中实现一个计数器,用于计算对象移动的次数
- 将对象从一个unordered_map移动到另一个容器
- 如何创建一个不可移动/复制构造的对象数组
- 将一个对象向量移动到另一个向量
- 子弹物理 - 如何根据另一个对象移动身体
- 将指向对象的指针从一个列表移动到另一个列表,而不破坏对象