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

 

posted @   山谷清芳  阅读(206)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示