gpt4 book ai didi

c++ - 涉及STL排序算法的令人困惑的SegFault

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:09 24 4
gpt4 key购买 nike

我正在尝试使用 STL 重新创建编程明珠第 15 栏中的程序。我正在尝试使用字符串和索引 vector 创建后缀数组。我将我读取的单词列表记录在一个名为 input 的字符串中,该字符串充当我在程序开头从 stdin 读取的以 ' ' 分隔的单词列表。在我到达代码的排序部分之前,一切都按预期工作。我想使用 STL 的排序算法,但我对我似乎正在创建的段错误感到完全困惑。

我有:

vector<unsigned int> words;

和全局变量

string input;

我定义了我的自定义比较函数:

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;
}

当我运行代码时:

sort(words.begin(), words.end());

程序顺利退出。

但是,当我运行代码时:

sort(words.begin(), words.end(), wordncompare);

我在 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 0x000000000040188d in std::__unguarded_linear_insert<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std::allocator<unsigned int> > >, unsigned int, bool (*)(unsigned int, unsigned int)> (__last=..., __val=90, __comp=0x400edc <wordncompare(unsigned int, unsigned int)>)
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_algo.h:1735
#3 0x00000000004018df in std::__unguarded_insertion_sort<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std::allocator<unsigned int> > >, bool (*)(unsigned int, unsigned int)> (__first=..., __last=..., __comp=0x400edc <wordncompare(unsigned int, unsigned int)>)
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_algo.h:1812
#4 0x0000000000402562 in std::__final_insertion_sort<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std::allocator<unsigned int> > >, bool (*)(unsigned int, unsigned int)> (__first=..., __last=..., __comp=0x400edc <wordncompare(unsigned int, unsigned int)>)
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_algo.h:1845
#5 0x0000000000402c20 in std::sort<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std::allocator<unsigned int> > >, bool (*)(unsigned int, unsigned int)> (__first=..., __last=..., __comp=0x400edc <wordncompare(unsigned int, unsigned int)>)
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_algo.h:4822
#6 0x00000000004012d2 in main (argc=1, args=0x7fffffffe0b8) at text_gen2.cpp:70

我在另一个程序中有类似的代码,但在那个程序中我使用的是 vector 而不是 vector 。对于我的一生,我无法弄清楚自己做错了什么。谢谢!

最佳答案

您的比较器很可能不满足严格的弱排序;例如,它违反了传递性,因为存在一些值环,使得 A < B、B < C 和 C < A。这里是 requirements .我看不到它,但我会继续盯着它看几分钟。

关于c++ - 涉及STL排序算法的令人困惑的SegFault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2441045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com