c++ - 为什么 Vector 不排序?

标签 c++ sorting vector

我正在解决一个关于 oj 的问题。但是突然发现vector<char*>不会按我的目的排序。我究竟做错了什么?如果有人能让我清楚这个问题......问题描述很简单,你只需要从输入文件中取出单词并对其进行排序。这是我所做的,但它不会排序:

vector<char*>V;
char str[501][201];
int l=0;
char str1[]= {'~','.','\n','\r',' ','!','@','#','$','%','^','&','*','(',')','+','-','_','=','{','}','[',']',':',';','"','<','>','?','/','|'};
while(gets(str[l++]))
{

    for(int i=0; str[l-1][i]; i++)
    {
        if(str[l-1][i]>='A' && str[l-1][i]<='Z')str[l-1][i]=str[l-1][i]-'A'+'a';
    }
    char *pch;
    pch=strtok(str[l-1],str1);
    while(pch!=NULL)
    {
        // printf("%s\n",pch);
        V.push_back(pch);
        pch=strtok(NULL,str1);
    }
}

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

for(vector<char*>::iterator it=V.begin(); it!=V.end(); it++)
    cout<<*it<<endl;

最佳答案

应用于 char * 时, <运算符(sort() 默认为)按指针值排序,而不是按字典顺序。您需要提供自定义比较器。在 C++11 中,这相当简单:

sort(V.begin(), V.end(),
     [](char const * a, char const * b) { return strcmp(a, b) < 0; });

如果您的编译器不支持 lambda,您必须在函数外声明一个合适的比较器:

struct CStringLess {
    bool operator()(char const * a, char const * b) const {
        return strcmp(a, b) < 0;
    }
};
⋮
sort(V.begin(), V.end(), CStringLess());

您遇到的另一个问题是 str1不是空终止的,如strtok()需要。但与其将其添加到末尾,不如将其重新定义为 C 字符串,这样更简洁并且免费为您提供空终止符:

char * str1 = "~.\n\r !@#$%^&*()+-_={}[]:;\"<>?/|";

关于c++ - 为什么 Vector 不排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17260343/

相关文章:

c++ - 是否可以在递归函数中进行命中和试验矩阵而不创建多个拷贝?

linux - 排序选项前面的数字表示法指的是什么?

javascript - 对象数组未按正确顺序排序

c++ - 在多态对象的 STL vector 上调用特定于对象的函数

c++ - 创建 std::vector 减去一个元素的拷贝的最快方法

c++ - 如何让69.99*100打印6999而不是6998?

c++ - 使用 C++11 占位符作为 lambdas?

c++ - 核心延迟测试 ARMv8.1

python - 按第一个、第二个、第三个字符的字母顺序对索引进行排序

c++ - 填充指针 vector