为什么Vector不会排序?

时间:2013-06-23 11:35:24

标签: 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;

1 个答案:

答案 0 :(得分:11)

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

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

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

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字符串,这更简洁并且免费提供null终止符:

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