c++ b树的问题

Issue with C++ B-tree

本文关键字:问题 c++      更新时间:2023-10-16

我正在使用谷歌的c++ b树,我有一个问题,有人可能能够回答。

首先我得到以下错误:

In file included from ref_impl/../include/btree_map.h:31:0,
             from ref_impl/core.cpp:48:
ref_impl/../include/btree.h: In instantiation of ‘btree::btree_node<Params>::reference btree::btree_node<Params>::value(int) [with Params = btree::btree_map_params<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> >, 256>; btree::btree_node<Params>::reference = std::pair<const unsigned int, unsigned int>&]’:
ref_impl/../include/btree.h:809:33:   required from ‘btree::btree_iterator<Node, Reference, Pointer>::pointer btree::btree_iterator<Node, Reference, Pointer>::operator->() const [with Node = btree::btree_node<btree::btree_map_params<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> >, 256> >; Reference = std::pair<const unsigned int, unsigned int>&; Pointer = std::pair<const unsigned int, unsigned int>*; btree::btree_iterator<Node, Reference, Pointer>::pointer = std::pair<const unsigned int, unsigned int>*]’
ref_impl/core.cpp:539:18:   required from here 
ref_impl/../include/btree.h:557:57: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]

btree.h:

pointer operator->() const {
    return &node->value(position);
 }

那似乎是错误的原因。

部分代码如下:

auto range = duplicates.equal_range(query_ids_temp[i]);
    for (auto it = range.first; it != range.second; ++it) {
//error     
       std::vector<unsigned int>::iterator pos = std::find(deleted_queries.begin(), deleted_queries.end(), it->second);
    //error
        if (pos != deleted_queries.end()) {
            duplicates.erase(it);
            deleted_queries.erase(pos);
        } else {
            query_ids.push_back(it->second);
        }
    } 

错误似乎是it->秒

另外我试过:

for (btree_multimap<unsigned int, unsigned int>::iterator it = range.first; it != range.second; ++it) {
                    //error
        auto temp = it->second;
                    //error
        std::vector<unsigned int>::iterator position = std::find(deleted_queries.begin(), deleted_queries.end(), temp);
        if (position != deleted_queries.end()) {
            duplicates.erase(temp);
            deleted_queries.erase(position);
        } else {
            query_ids.push_back(it->second);
        }
    }

请记住,错误似乎出现在auto temp = it->second;

我也试过了:

auto p = duplicates.find(query_ids_temp[i]);
      if(p != duplicates.end()) { // found a name
        do {
                    //error
            auto temp = p->second;
                    //error
            auto pos = std::find(deleted_queries.begin(), deleted_queries.end(), temp);
            if (pos != deleted_queries.end()) {
                duplicates.erase(p->second);
                deleted_queries.erase(pos);
            } else {
                query_ids.push_back(p->second);
            }
          p++;
        } while (p != duplicates.upper_bound(query_ids_temp[i]));
      }
      else{
        cout << "Name not found.n";
      }

问题似乎又一样了:auto temp = p->second;

有什么建议吗?

Google B-tree的中心警告是,突变会使迭代器失效。在循环中调用duplicate .erase()会使"p"无效。

由于这个原因,erase()方法返回一个迭代器,因此您可以这样写:
if (...) {
  p = duplicates.erase(...);
  ...
} else {
  ...
  p++;
}

请提供给出警告的编译器版本的详细信息。