关于C++ for循环迭代访问容器的沙雕问题

void PersistentSkiplistWrapper::Init(const std::string& path, uint64_t size, int32_t max_height, int32_t branching_factor, size_t key_size, uint64_t opt_num,size_t per_1g_num) {
        allocator_ = new PersistentAllocator(path, size);
        for(auto list : skiplists_){
            list = new Persistent_SkipList(allocator_, max_height, branching_factor, key_size, opt_num ,per_1g_num);
        }
        key_size_ = key_size;
    }

这段代码写出来感觉没什么问题,但是运行的时候总有段错误,怎么也找不到问题在哪,最后发现skiplists里面的指针都是空指针,这就很怪了,明明有初始化,然后查文档才发现这种for循环的访问是迭代那种访问,然后我的理解是这种迭代就跟函数的值传递一样,list只是一个副本,for里面的修改只是对副本的修改,没有动真正的数据,所以才会造成for里面初始化了,但是除了for又全是空指针的问题!

void PersistentSkiplistWrapper::Init(const std::string& path, uint64_t size, int32_t max_height, int32_t branching_factor, size_t key_size, uint64_t opt_num,size_t per_1g_num) {
        allocator_ = new PersistentAllocator(path, size);
        for(auto &list : skiplists_){
            list = new Persistent_SkipList(allocator_, max_height, branching_factor, key_size, opt_num ,per_1g_num);
        }
        key_size_ = key_size;
    }

加个引用就完事了
(这就让我很怀念Rust了,Rust里面直接就是一个list的不可变引用,修改的时候编译器就给你不过,这C++就不告诉我,害我找半天(C++:怪我咯,是你太菜))

现在又遇到了第二个问题,有一个vector>,当我用for(auto file : files)去遍历这个vector的时候,编译不过报错:

pair(const std::pair<_T1, _T2>&) is implicitly deleted because the default definition...

查一了下发现原来是这样的for循环相当于会复制一份,而刚好pair中有unique_ptr不能被复制,所以就出错了,所以这个地方需要改成引用就没问题:for (auto &file : files)

你可能感兴趣的:(关于C++ for循环迭代访问容器的沙雕问题)