C/C++编程:确保容器中的对象拷贝正确而高效

容器中保存了对象,但并不是你提供给容器的那些对象。而当你从容器中取出一个对象时,你所取出的也不是容器中所保存的那份。当向容器中加入对象时,存入容器的是你所指定对象的拷贝。当从容器中取出一个对象时,你所得到的是容器中所保存的对象的拷贝。进去的是拷贝,出来的也是拷贝,也就是STL的工作方式。

vector

class read_hook{
public:

    void *ctx;
    char disable;
};

int main(){
    std::vector<read_hook*> vec;

    for (int i = 0; i < 3; ++i) {
        read_hook *hook = new read_hook;
        printf("%p\t", hook);
        vec.push_back(hook);
    }
    printf("\n");

    for (int i = 0; i < 3; ++i) {
        read_hook *hook = vec[i];
        printf("%p\t", hook);
    }
    printf("\n");

    for(auto iter : vec){
        read_hook *hook = iter;
        printf("%p\t", hook);
    }

    printf("\n");
    for(auto &iter : vec){
        read_hook *hook = iter;
        printf("%p\t", hook);
    }
 
    __gnu_cxx::__normal_iterator<read_hook **, std::vector<read_hook *>> iter;
    for (iter = vec.begin(); iter != vec.end(); ++iter) {
        read_hook *hook = *iter;
        printf("%p\t", hook);
    }
    printf("\n");
}

 

 好的写法:

class read_hook{
public:
    read_hook(){
        printf("read_hook, %p\n", this);
    }
    ~read_hook(){
        printf("~read_hook, %p\n", this);
    }
    void *ctx;
    char disable;
};

int main(){
    std::vector<read_hook*> vec;
    printf("\n   --- vec.size: %zu --- \n", vec.size());
    for (int i = 0; i < 3; ++i) {
        read_hook *hook = new read_hook;
        vec.push_back(hook);
    }
    printf("\n   --- vec.size: %zu --- \n", vec.size());


    while (!vec.empty()){
        read_hook *hook = *vec.begin();
        //read_hook *hook = vec.front();
        vec.erase(vec.begin());
        delete hook;
    }
    printf("\n   --- vec.size: %zu --- \n", vec.size());

    getchar();
}

class read_hook{
public:
    read_hook(){
        printf("read_hook, %p\n", this);
    }
    ~read_hook(){
        printf("~read_hook, %p\n", this);
    }
    void *ctx;
    char disable;
};

int main(){
    std::vector<read_hook*> vec;
    printf("\n   --- vec.size: %zu --- \n", vec.size());
    for (int i = 0; i < 3; ++i) {
        read_hook *hook = new read_hook;
        vec.push_back(hook);
    }
    printf("\n   --- vec.size: %zu --- \n", vec.size());


    while (!vec.empty()){
        read_hook *hook = vec.back();
        vec.erase(vec.end() - 1);
        delete hook;
    }
    printf("\n   --- vec.size: %zu --- \n", vec.size());

    getchar();
}

class read_hook{
public:
    read_hook(){
        printf("read_hook, %p\n", this);
    }
    ~read_hook(){
        printf("~read_hook, %p\n", this);
    }
    void *ctx;
    char disable;
};


int main(){
    std::vector<read_hook*> vec;
    printf("\n   --- vec.size: %zu --- \n", vec.size());
    for (int i = 0; i < 3; ++i) {
        read_hook *hook = new read_hook;
        vec.push_back(hook);
    }
    printf("\n   --- vec.size: %zu --- \n", vec.size());


    read_hook *hook = vec[1];
    delete hook;
    vec.erase(vec.begin() + 1);
    printf("\n   --- vec.size: %zu --- \n", vec.size());

    getchar();
}

不好的写法:

class read_hook{
public:
    read_hook(){
        printf("read_hook, %p\n", this);
    }
    ~read_hook(){
        printf("~read_hook, %p\n", this);
    }
    void *ctx;
    char disable;
};

int main(){
    std::vector<read_hook*> vec;
    printf("\n   --- vec.size: %zu --- \n", vec.size());
    for (int i = 0; i < 3; ++i) {
        read_hook *hook = new read_hook;
        vec.push_back(hook);
    }
    printf("\n   --- vec.size: %zu --- \n", vec.size());
    
    for (int i = (int)vec.size(); i > -1; --i) {
        read_hook *hook = vec[i];
        vec.pop_back();
        delete hook;
    }
    printf("\n   --- vec.size: %zu --- \n", vec.size());

    getchar();
}

list

class read_hook {
public:
    read_hook() {
        printf("read_hook, %p\n", this);
    }

    ~read_hook() {
        printf("~read_hook, %p\n", this);
    }

    void *ctx;
    char disable;
};

int main(){
    // list不能随意访问元素
    std::list<read_hook*> list;

    for (int i = 0; i < 3; ++i) {
        read_hook *hook = new read_hook;
        list.push_back(hook);
    }
    printf("\n   --- list.size: %zu --- \n", list.size());

    while (!list.empty()){
        read_hook *hook = list.back();
        delete hook;
        list.remove(hook);
    }
    printf("\n   --- list.size: %zu --- \n", list.size());
    getchar();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值