以下代码是产生问题的简化示例.
许多字符串(char*)被插入到集合中,其中许多字符串是非唯一的.应检测重复的字符串,并返回指向原始插入的指针; 但是,有时这不会发生,并且已插入的字符串再次插入,就像它已经存在一样.
结果集应包括:"aa","bb","cc".输出显示该组最终得到:"bb","cc","aa","bb".更改首次插入的字符串似乎会更改"允许"的副本.
不使用字符串上的数字前缀,但添加了数字前缀以确保每个字符串都有唯一的指针; 没有它们,问题仍然存在.
使用默认比较器和非前缀字符串确实按预期工作,但这只比较指针; 为字符串添加前缀会产生唯一的指针,并插入所有字符串.
#include <iostream>
#include <set>
#include <cstring>
using std::cout;
using std::endl;
using std::set;
using std::pair;
typedef set<const char*>::const_iterator set_iter;
struct cmp_op {
int operator() (const char* x,const char* y) const {
int r = strcmp(x,y);
//cout << "cmp: " << x << ((r)?((r>0)?" > ":" < "):" == ") << y << endl;
return r;
}
};
int main() {
//first char ignored, just ensures unique pointers
const char* a[] = {"1bb","2aa","3aa","4bb","5cc","6aa","7bb","8cc","9bb"};
const …Run Code Online (Sandbox Code Playgroud)