调试std::set问题

Debugging a std::set issue

本文关键字:问题 set 调试 std      更新时间:2023-10-16

我写了一个具有特殊排序的集合:

std::set<int,std::function<bool(int const&,int const&)>> ListCases;

我对它有问题。我无法从中删除值9,因为对的调用

ListCases.find(9);

不返回可取消引用的迭代器。但当我用以下循环打印该集合的所有值时:

for (auto & eVal : ListCases)
  std::cerr << " " << eVal;

我可以看到值9在存储的值列表中。

当我在一个单独的程序中隔离代码时,这个错误就会消失。使用编译器选项-fsanitize=undefined和其他检查运行clang++不会返回任何内容。

对此有什么可能的解释?还可以考虑其他什么调试选项?

您是否提供比较功能?

使用这段代码

typedef std::set<int,std::function<bool(int const&,int const&)>> MySet;
MySet wListCases([](int l, int r){ return l<r; });
wListCases.insert(9);
wListCases.insert(88);
wListCases.insert(1);
auto found = wListCases.find(9);
for (auto & eVal : wListCases)
  std::cout << " " << eVal << std::endl;

如果我不提供lambda [](int l, int r){ return l<r; }的函数,这个程序就会崩溃。否则,它将找到9并打印1, 9, 88