stl::list只是浅复制
分别直接存入类型和存入地址,再list1 = list2(list2复制给list1),然后改变list2中的元素(如果该元素是地址,则改变该地址所指向的对象的内容)。
可以看出stl::list只是浅复制,只拷贝list元素(无论该元素是基本类型,构造类型,还是地址),不会改变该类型(当该类型为指针时)所指向的内容,以及不改变类型中的指针元素所指向的内容;
#include <iostream> #include<list> using namespace std; struct st{ double a; double *d; }; int main() { // 基本类型 list<int> list1{2,3,4,5}; list<int> list2{6,7,8,9}; list1=list2; *list2.begin() = 10; cout<<"list存基本类型:"<<endl; cout<<*list1.begin()<<endl; cout<<*list2.begin()<<endl; cout<<endl; // list存基本类型的地址 int i1=-1; int i2=-2; int* p1 = &i1; int *p2 = &i2; list<int*> list1p{p1}; list<int*> list2p{p2}; list1p=list2p; *(*list2p.begin()) = -3; cout<<"list存基本类型的地址:"<<endl; cout<<*(*list1p.begin())<<endl; cout<<*(*list2p.begin())<<endl; cout<<endl; // list直接存类 double d1 = 100.1; double d2 = 100.2; st s1; st s2; s1.a=1.1; s2.a=1.2; s1.d = &d1; s2.d = &d2; list<st> list11{s1}; list<st> list22{s2}; list11=list22; (*list22.begin()).a = 1.3; *((*list22.begin()).d) = 100.3; //改变类中的地址元素所指向的对象的值 cout<<"list直接存类:"<<endl; cout<<(*list11.begin()).a<<endl; cout<<(*list22.begin()).a<<endl; cout<<*((*list11.begin()).d)<<endl; cout<<*((*list22.begin()).d)<<endl; cout<<"d1="<<d1<<endl; cout<<"d2="<<d2<<endl; cout<<endl; // list存类的地址 st* s1p= new st(); st* s2p = new st(); s1p->a = 111; s2p->a=222; list<st*> list11p{s1p}; list<st*> list22p{s2p}; list11p=list22p; (*list22p.begin())->a = 333; cout<<"list存类的地址:"<<endl; cout<<(*list11p.begin())->a<<endl; cout<<(*list22p.begin())->a<<endl; cout << "Hello World"; return 0; }
list存基本类型:
6
10
list存基本类型的地址:
-3
-3
list直接存类:
1.2
1.3
100.3
100.3
d1=100.1
d2=100.3
list存类的地址:
333
333
Hello World
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!