2013-03-21 3 views
-1

Я использую Google's C++ B-tree, и у меня есть проблема, с которой кто-то может ответить.Проблема с C++ B-tree

Прежде всего, я получаю следующее сообщение об ошибке:

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); 
     } 
    } 

Пожалуйста, имейте в виду, что ошибка, кажется, при авто 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"; 
     } 

И проблема, кажется, опять же: авто температура = p-> второй;

Любые предложения?

+7

Вы оставили важную часть ошибки. В принципе, компилятор сказал, что «была ошибка XY на месте Z» или «на месте Z, была ошибка XY». Вы только разместили «на месте Z.» И можете ли вы пометить упомянутые номера исходных строк в коде, например. используя комментарии? – Angew

+0

Добавленные комментарии вы можете рассказать мне, если вам нужно что-то еще? – glarkou

+2

Вы все еще не добавили полное сообщение об ошибке. Пожалуйста, сделай так. – Angew

ответ

1

Главное предупреждение с B-деревом Google заключается в том, что мутации недействительны итераторами. Вызов duplicates.erase() внутри цикла аннулирует «p».

стирани() возвращает итератор по этой причине, так что вы можете написать что-то вроде:

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

BTW, просьба сообщить подробности о том, какая версия компилятора дает предупреждение.

+0

Версия компилятора GCC 4.7.2 - Ubuntu 12.04. Действительно ли p-> второй правильный способ получить значение? – glarkou

+0

p-> second - это значение на карте, p-> first - это ключ. Я думаю, вы на самом деле хотите написать p = duplicates.erase (p); –

Смежные вопросы