карта — проблема с C ++ B-деревом

Я использую Google 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);
}
}

Похоже, что это ошибка -> вторая

Дополнительно я попробовал:

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;

Какие-либо предложения?

-1

Решение

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

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

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

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

1

Другие решения

Других решений пока нет …