C++,在sort中使用谓词会怎样排序?

发布于 2022-09-04 00:01:36 字数 2843 浏览 25 评论 0

用来学习C++的书事《C++ Primer》,看到书上关于谓词的这部分的时候,自己动手敲了一下,为什么输出结果是这样的啊?书上说可以按照字符串的长度来排序,然后我就想看下按照字符串长度从长到短和从短到长两种方式来排一下会怎样,结果发现他们虽然是按照字符串的长度分好了,可是长度相同的字符串之间并没有进行排序吖。
先放用来输入的文件

adada  adada  adada ddhu huafw fhau igk jjjj bbb iii www ccc jjj ppp ooo ddd ccc aaa ddd iii www ccc bbb dd 

然后是输出的结果


smaller elimdups:
dd  jjj  bbb  ccc  www  iii  ddd  aaa  ccc  ddd  ooo  ppp  ccc  www  iii  bbb  igk  jjjj  fhau  ddhu  adada  huafw  adada  
bigger elimdups :
adada  huafw  adada  ddhu  fhau  jjjj  jjj  bbb  ccc  www  iii  ddd  aaa  ccc  ddd  ooo  ppp  ccc  www  iii  bbb  igk  dd  
elimdups
aaa  adada  bbb  ccc  dd  ddd  ddhu  fhau  huafw  igk  iii  jjj  jjjj  ooo  ppp  www  

下面是代码,我还把smaller,bigger函数里的size去掉了尝试了下,发现这样产生的结果就是正常的,一个从大到小一个从小到大。可以为什么用字符串的长度来比较就会这样呢?

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool smaller (const string str1, const string str2){
    return str1.size() < str2.size();
}
bool bigger (const string str1, const string str2){
    return str1.size() > str2.size();
}
void smaller_pre_elimdups (vector<string> &word){
    sort(word.begin(), word.end(), smaller);
    auto unique_end = unique(word.begin(), word.end());
    word.erase(unique_end, word.end());
}
void bigger_pre_elimdups (vector<string> &word){
    sort(word.begin(), word.end(), bigger);
    auto unique_end = unique(word.begin(), word.end());
    word.erase(unique_end, word.end());    
}
void elimdups (vector<string> &word){
    sort(word.begin(), word.end());
    auto unique_end = unique(word.begin(), word.end());
    word.erase(unique_end, word.end());
}

int main(){
    ifstream input("filein.txt");
    ofstream output("out.txt", ostream::app);
    string reader;
    vector<string> s_str;
    vector<string> b_str;
    vector<string> str;
    
    while (getline(input, reader)){
        istringstream rectord(reader);
        string temp;
        while (rectord >> temp){
            s_str.push_back(temp);
            b_str.push_back(temp);
            str.push_back(temp);
        }
    }    

    smaller_pre_elimdups(s_str);
    bigger_pre_elimdups(b_str);
    elimdups(str);
    
    output << '\n' << "smaller elimdups:" << '\n';
    for (auto smaller : s_str)
        output << smaller << "  ";
    
    output << '\n' << "bigger elimdups :" << '\n';
    for (auto bigger : b_str)
        output << bigger << "  ";
    
    output << '\n' << "elimdups" << '\n';
    for (auto e : str)
        output << e << "  ";
    
    output << endl;
    return 0;    
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

没有伤那来痛 2022-09-11 00:01:36

排序的结果是正确的
不过只有排序之后,unqiue的结果才符合你的要求(大概,你没讲你什么要求)~~
文档中的unique示例实现确实只能针对有序的区间去重。。
所以并不奇怪使用.size()会导致那种结果
楼主的问题到底是什么。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文