c++ b树的问题
Issue with C++ B-tree
我正在使用谷歌的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++;
}
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题