为什么STL使用严格弱排序的比较函数?为什么不能进行部分订购?
如果我提供一个非传递会发生什么Comparator来Collections.sort?我可以遇到无限循环吗?
我写的一个小测试产生了一个输出,但我想确保始终如此.
问题是在某些情况下,我的比较器可以产生循环,在这种情况下,我只是想确保它不会遇到无限循环.我不关心实际结果.
我知道要使用std :: sort(),比较函数必须是严格的弱顺序,否则它会因访问超出范围的地址而崩溃.(https://gcc.gnu.org/ml/gcc-bugs/2013-12/msg00333.html)
但是,当比较函数不是严格的弱顺序时,为什么std :: sort()访问越界地址?它试图比较什么?
我也想知道STL中是否还有其他陷阱需要注意.
我正在尝试使用STL重新创建编程珍珠的第15列中的程序.我正在尝试使用字符串和索引向量创建后缀数组.我记录了我在一个名为input的字符串中读取的单词列表,该字符串充当由我在程序开头从stdin读取的''分隔的单词列表.一切都按预期工作,直到我到达代码的排序部分.我想使用STL的排序算法,但我对我似乎正在创建的seg错误感到非常困惑.
我有:
vector<unsigned int> words;
Run Code Online (Sandbox Code Playgroud)
和全局变量
string input;
Run Code Online (Sandbox Code Playgroud)
我定义了自定义比较函数:
bool wordncompare(unsigned int f, unsigned int s) {
int n = 2;
while (((f < input.size()) && (s < input.size()))
&& (input[f] == input[s])) {
if ((input[f] == ' ') && (--n == 0)) {
return false;
}
f++;
s++;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
当我运行代码时:
sort(words.begin(), words.end());
Run Code Online (Sandbox Code Playgroud)
该计划顺利退出.
但是,当我运行代码时:
sort(words.begin(), words.end(), wordncompare);
Run Code Online (Sandbox Code Playgroud)
我在STL内部生成了一个SegFault.
GDB反向跟踪代码如下所示:
#0 0x00007ffff7b79893 in std::string::size() const () from /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so.6
#1 0x0000000000400f3f in wordncompare (f=90, s=0) at text_gen2.cpp:40
#2 …Run Code Online (Sandbox Code Playgroud)