list列表的深拷贝

七七约会 2008-01-03 02:34:24
我在某个类中用了一个list类型的数据成员(如:list<CADCAccrMlcLeaf> m_pLeaves, CADCAccrMlcLeaf为类名),如果我要在该类中做拷贝构造和重载赋值运载符,我该怎么做?相当于我该怎么去实现这个list列表的深拷贝呢?
...全文
1378 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
光跃 2008-01-03
  • 打赏
  • 举报
回复
不好意思,我在6楼贴得代码是我后来测试list指针对象用的,贴错了。把所有A*换成A 就行了。
int main()
{
list<A> alist;
A a(3);
A b(4);
alist.push_back(a);
alist.push_back(b);

list<A> blist(alist);
// list<A> blist = alist;
// blist.push_back(a);
// blist.push_back(b);
// copy(alist.begin(), alist.end(), back_inserter(blist));
cout << endl << &*(alist.begin()) << " " << &*(++alist.begin()) << endl; //print a elem address
cout << endl << &*(blist.begin()) << " " << &*(++blist.begin()) << endl; //print b elem address, should be different from a's.
return 0;
}
hastings 2008-01-03
  • 打赏
  • 举报
回复
是这种情况吗??
#include<list>
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
using std::list;
class CADCAccrMlcLeaf
{
int m_i;
public:
explicit CADCAccrMlcLeaf(int i):m_i(i){}
friend std::ostream& operator<<(std::ostream& os,const CADCAccrMlcLeaf& a){return os<<a.m_i;}
};
class A
{
list<CADCAccrMlcLeaf> m_pLeaves;
public:
A(){}
void Init(const list<int>& lst)
{
list<int>::const_iterator it1(lst.begin()),it2(lst.end());
for(;it1!=it2;++it1)
m_pLeaves.push_back(CADCAccrMlcLeaf(*it1));
}
friend std::ostream& operator<<(std::ostream& os,const A& a)
{
list<CADCAccrMlcLeaf>::const_iterator it1(a.m_pLeaves.begin()),it2(a.m_pLeaves.end());
for(;it1!=it2;++it1)
os<<*it1<<' ';
return os<<"\n";
}
// A(const A& a):m_pLeaves(a.m_pLeaves){}//不需要也能正常工作
// A& operator=(const A& a){if(this!=&a)m_pLeaves=a.m_pLeaves;return *this;}//不需要也能正常工作
};
int main()
{
srand((unsigned int)time(0));
list<int> lst;
for(int i(0);i<10;++i)
lst.push_back(rand()%32);
A a;
a.Init(lst);
A b(a),c;//拷贝复制
c=b;//赋值
cout<<"a= "<<a;
cout<<"b= "<<b;
cout<<"c= "<<c;
////////////////////////////////////////////////////////
system("PAUSE");
return 0;
}
光跃 2008-01-03
  • 打赏
  • 举报
回复
list的深拷贝不就是把list A的内容拷贝到list B中去吗?
list的拷贝本身就带有元素内容的复制行为,而不是元素指针的拷贝。所以list B的拷贝构造函数,赋值运算符,包括push_back, push_front等运算都会拷贝list A的内容。也就是说通过这些运算后,list<TheClass> A的元素与B的元素地址就是不同的。
所以直接调用上述运算的结果就是深拷贝。
class A{
public:
A(int a=0):__a(a){};
int GetValue(){return __a;};
private:
int __a;

friend ostream& operator << (ostream& c, const A& a){
cout << a.__a;
return c;
};

};

int main()
{
list<A*> alist;
A *a = new A(3);
A *b = new A(4);
alist.push_back(a);
alist.push_back(b);
list<A*> blist(alist);
// list<A*> blist = alist;
// blist.push_back(a);
// blist.push_back(b);
// copy(alist.begin(), alist.end(), back_inserter(blist));
cout << endl << &*(alist.begin()) << " " << &*(++alist.begin()) << endl; //print elem address
cout << endl << &*(blist.begin()) << " " << &*(++blist.begin()) << endl;
return 0;
}

七七约会 2008-01-03
  • 打赏
  • 举报
回复
CADCAccrMlcLeaf这个类中,拷贝构造函数和重载operator=函数都有啊!
ryfdizuo 2008-01-03
  • 打赏
  • 举报
回复
关键CADCAccrMlcLeaf这个类你是怎么定义的,
有没有拷贝构造函数,或着重载了operator=函数,
七七约会 2008-01-03
  • 打赏
  • 举报
回复
首先谢谢你们的帮助,问题是list列表中是装的类的对象,不是指针对象,好象那些方法都不行呢!要不你们写点代码给我看看!
wsqshz 2008-01-03
  • 打赏
  • 举报
回复
调用insert或copy函数,也可使用引用计数完成深拷贝
csdn5211 2008-01-03
  • 打赏
  • 举报
回复
在拷贝构造函数里直接将这个成员赋值就行,list自己就是值拷贝吧。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧