关于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<pair<shared_ptr, unique_ptr>>,当我用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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容