Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用自定义排序函数对向量中的字符串排序时出现分段错误<;字符串>;_C++_Sorting_Stl_Stdvector - Fatal编程技术网

C++ 使用自定义排序函数对向量中的字符串排序时出现分段错误<;字符串>;

C++ 使用自定义排序函数对向量中的字符串排序时出现分段错误<;字符串>;,c++,sorting,stl,stdvector,C++,Sorting,Stl,Stdvector,我试图对包含字符串的向量进行排序。我有以下主要功能的代码 int size; cin >> size; vector<string> s; cout << "READ" << endl; for (int i = 0; i<size; i++) { string str; cin >> str; s.push_back(str); } cout << "READ" << endl;

我试图对包含字符串的向量进行排序。我有以下主要功能的代码

int size;
cin >> size;
vector<string> s;
cout << "READ" << endl;
for (int i = 0; i<size; i++)
{
    string str;
    cin >> str;
    s.push_back(str);
}
cout << "READ" << endl;

cout << "Passed" << endl;
sort(s.begin(), s.end(), comp);

for (int i = 0; i<size; i++)
{
    string st = s.at(I);
    cout << st << endl;
}


return 0;
对于许多其他输入,它给出了正确的结果,但是对于上面的结果,我得到了这个结果

READ
READ
Passed
我搜索了很多,但在我的
comp
函数中找不到错误。

此情况:

 if (s1.empty() or s2.empty())
    return false;
不满足comp函数的严格弱排序要求(从)

如果x 在您的情况下,如果
z
是空字符串而
x
y
不是空字符串,则它既不能满足
x
也不能满足
z

可能的实施是:

if( s2.empty() ) return !s1.empty();
if( s1.empty() ) return false;
但我不明白为什么不能使用
std::greater
std::string::compare
std::string::operator>()
来代替手动执行此条件:

 if (s1.empty() or s2.empty())
    return false;
不满足comp函数的严格弱排序要求(从)

如果x 在您的情况下,如果
z
是空字符串而
x
y
不是空字符串,则它既不能满足
x
也不能满足
z

可能的实施是:

if( s2.empty() ) return !s1.empty();
if( s1.empty() ) return false;

但是我不明白为什么您不能使用
std::greater
std::string::compare
std::string::operator>()
来代替手动实现

您的comp方法被破坏了

对于这两个字符串“ac”和“ca”,comp(“ac”,“ca”)
与comp(“ac”,“ca”)
一样正确。因为当您尝试下一个位置时
s1[i]
,您应该立即返回false

正如您在评论中所说,您应该使用较短字符串的长度来处理不同长度的字符串,以避免访问过去字符串长度时出现错误

因此,您的comp方法应该是:

bool comp(string s1,string s2)
{
    // empty string comes last
    if(s1.empty()) return false;
    if(s2.empty()) return true;

    // limit to shorter string length
    unsigned int l = s1.length();
    if (s2.length() < l) l = s2.length();
    for(unsigned int i=0;i<l;i++)
    {
        // if chars are different at position i return immediately
        if(s1[i] > s2[i])
            return true;        
        if(s1[i] < s2[i])
            return false;        
    }
    // shorter string comes last
    return(s1.length() >= s2.length());
}
bool comp(字符串s1、字符串s2)
{
//空字符串排在最后
if(s1.empty())返回false;
if(s2.empty())返回true;
//限制为较短的字符串长度
无符号整数l=s1.length();
如果(s2.length()=s2.length());
}

您的补偿方法已损坏

对于这两个字符串“ac”和“ca”,comp(“ac”,“ca”)
与comp(“ac”,“ca”)一样正确。因为当您尝试下一个位置时
s1[i]
,您应该立即返回false

正如您在评论中所说,您应该使用较短字符串的长度来处理不同长度的字符串,以避免访问过去字符串长度时出现错误

因此,您的comp方法应该是:

bool comp(string s1,string s2)
{
    // empty string comes last
    if(s1.empty()) return false;
    if(s2.empty()) return true;

    // limit to shorter string length
    unsigned int l = s1.length();
    if (s2.length() < l) l = s2.length();
    for(unsigned int i=0;i<l;i++)
    {
        // if chars are different at position i return immediately
        if(s1[i] > s2[i])
            return true;        
        if(s1[i] < s2[i])
            return false;        
    }
    // shorter string comes last
    return(s1.length() >= s2.length());
}
bool comp(字符串s1、字符串s2)
{
//空字符串排在最后
if(s1.empty())返回false;
if(s2.empty())返回true;
//限制为较短的字符串长度
无符号整数l=s1.length();
如果(s2.length()=s2.length());
}

正如其他人所指出的,您的比较功能已损坏

下面是一个使用
std::greater()
作为比较函数的示例:

#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
#include <vector>

int main() {
    int size;
    if (!(std::cin >> size)) return -1;

    std::vector<std::string> v;
    for (int i = 0; i < size; i++) {
        std::string str;
        if (!(std::cin >> str)) return -1;
        v.push_back(str);
    }

    std::sort(v.begin(), v.end(), std::greater<std::string>());

    for (int i = 0; i < v.size(); i++) {
        std::cout << v[i] << std::endl;
    }

    return 0;
}
#包括

  • 正如其他人所指出的,您的比较功能已被破坏

    下面是一个使用
    std::greater()
    作为比较函数的示例:

    #include <algorithm>
    #include <functional>
    #include <iostream>
    #include <string>
    #include <vector>
    
    int main() {
        int size;
        if (!(std::cin >> size)) return -1;
    
        std::vector<std::string> v;
        for (int i = 0; i < size; i++) {
            std::string str;
            if (!(std::cin >> str)) return -1;
            v.push_back(str);
        }
    
        std::sort(v.begin(), v.end(), std::greater<std::string>());
    
        for (int i = 0; i < v.size(); i++) {
            std::cout << v[i] << std::endl;
        }
    
        return 0;
    }
    
    #包括
    


  • 为什么不使用?事实上我不知道……我一定会尝试一下。问题是,在比较函数中不使用s2的长度。输入的约束条件是每个字符串必须具有相同的长度,然后添加一个测试,该测试的版本化长度相同。如果没有这一点,输入中的错误将导致未处理的错误。为什么不使用?实际上我不知道它…我一定会尝试它。问题是,在比较函数中不使用s2的长度。输入的约束条件是每个字符串必须具有相同的长度,然后添加一个测试,对长度进行版本化都是一样的。如果输入错误会导致未经处理的错误,那么如果你能给出更新的代码就太好了……那么我可以澄清我严格弱顺序的概念。你能不能给我完整的comp函数代码,它不会因为上述输入出现分段错误……那就太好了……如果你能做到,那就太好了给出更新后的代码…然后我可以澄清我的严格弱顺序的概念u plz可以给我comp函数的完整代码,它不会因为上面的输入而出现分段错误…那太好了…不,两个字符串的长度必须相同…这是一个约束,而且还有一个约束,如果上面的字符串有一个字符,该字符大于两个字符串下面的字符串中腐蚀索引处的字符。两个字符串的长度必须相同……这是一个约束,并且还有一个约束,即如果上面的字符串有一个字符大于字符串中腐蚀索引处的字符下面的两个字符串应该使用
    std::greater
    交换是最好的方式…感谢您提供的信息使用
    std::greater
    交换是最好的方式…感谢您提供的信息