C++ 与C+的问题+;B-树

C++ 与C+的问题+;B-树,c++,map,c++11,b-tree,multimap,C++,Map,C++11,B Tree,Multimap,我正在使用,我有一个问题可能有人能够回答 首先,我得到以下错误: 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<Par

我正在使用,我有一个问题可能有人能够回答

首先,我得到以下错误:

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]
这似乎是错误的原因

我的部分代码如下所示:

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);
        }
    } 
auto range=duplicates.equal_range(查询id_temp[i]);
for(自动it=range.first;it!=range.second;++it){
//错误
std::vector::iterator pos=std::find(删除的\u querys.begin(),删除的\u querys.end(),it->second);
//错误
if(pos!=已删除的_querys.end()){
重复。删除(它);
删除查询。删除(pos);
}否则{
查询\u id。将\u推回(it->second);
}
} 
错误似乎是第二个错误

此外,我还尝试:

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);
        }
    }
for(btree_multimap::iterator it=range.first;it!=range.second;++it){
//错误
自动温度=它->秒;
//错误
std::vector::iterator position=std::find(已删除的_querys.begin()、已删除的_querys.end()、temp);
if(position!=deleted_querys.end()){
重复。擦除(临时);
删除查询。删除(位置);
}否则{
查询\u id。将\u推回(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 p=duplicates.find(查询id\u temp[i]);
如果(p!=duplicates.end()){//找到了一个名称
做{
//错误
自动温度=p->秒;
//错误
auto pos=std::find(已删除的\u querys.begin()、已删除的\u querys.end()、temp);
if(pos!=已删除的_querys.end()){
重复。擦除(p->秒);
删除查询。删除(pos);
}否则{
查询\u id.push\u back(p->second);
}
p++;
}while(p!=重复的上界(查询id\u temp[i]);
}
否则{
第二


有什么建议吗?

谷歌B-树的核心警告是变异会使迭代器失效。 循环中对duplicates.erase()的调用使“p”无效

由于这个原因,erase()方法返回一个迭代器,因此您可以编写如下内容:

if (...) {
  p = duplicates.erase(...);
  ...
} else {
  ...
  p++;
}

顺便说一句,请提供有关哪个编译器版本发出警告的详细信息。

您遗漏了错误的重要部分。基本上,编译器说“Z处有错误XY”或“Z处有错误XY”。您只发布了“Z处有错误XY”你能在代码中标记所提到的源代码行号吗?例如,使用注释?你仍然没有添加完整的错误消息。请这样做。实际上你没有。错误消息不完整。顺便说一句,这不是一个错误,而是一个警告。如果编译器只说了这些,它实际上成功地编译了你的程序。但是你应该e此警告很严重。您实际上没有引用btree.h中的相关行。它似乎是
reinterpret\u cast(字段值[i])这个代码看起来很可疑。我建议用这个问题来窃取这个代码的作者。看起来它们违反了混淆规则。@ SalaMIS:考虑这个警告与您的程序产生错误输出无关。如果您有兴趣解决这个问题,请提供编译器版本GCC 4.7.2-Ubuntu。12.04.p->second是获得值的正确方法吗?p->second是地图中的值,p->first是关键。我想你实际上是想写p=重复项。擦除(p);
if (...) {
  p = duplicates.erase(...);
  ...
} else {
  ...
  p++;
}