gpt4 book ai didi

c++ - 将 C++ 中的列表对象移动到另一个对象

转载 作者:行者123 更新时间:2023-11-28 01:17:46 25 4
gpt4 key购买 nike

我试图理解这段代码是如何工作的。

// 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 obj\n";}
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 object\n";
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 Nodes\n";
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 Nodes\n";
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 移动到其他对象即可。内部进展如何?

你可以在这里看到这个 Action : https://repl.it/repls/WildComfortableLesson

最佳答案

那是因为std::list implements move assignment for you .

顺便说一句,移动构造函数可以通过使用初始化列表进行一些改进:

Node(Node&& n) : ll{std::move(n.ll)}, pll{std::move(n.pll)} {}

这将移动构造两个列表(使用 std::list 的移动构造函数),而不是默认构造然后移动分配它们。复制构造函数也是如此。

关于c++ - 将 C++ 中的列表对象移动到另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58086930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com