栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

(2021-10-06)关于C++ STL的随笔

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(2021-10-06)关于C++ STL的随笔

STL的几个随笔:关于升序和降序 基本数据类型的set容器的升序与降序
#include 
#include 
#include 
#include 
using namespace std;

int main() {
    static default_random_engine e(time(nullptr));
    static uniform_int_distribution u(1, 100);

    
    set s_default;
    set> s_greater;
    set> s_less;
    for (int i = 0; i < 10; ++i) {
        s_default.insert(u(e));
        s_greater.insert(u(e));
        s_less.insert(u(e));
    }
    cout << "The default set container is :" << endl;
    for (int v : s_default) 
        cout << v << ' ';
    cout << endl << endl;
    cout << "The greater set container is :" << endl;
    for (int v : s_greater) 
        cout << v << ' ';
    cout << endl << endl;
    cout << "The less set container is :" << endl;
    for (int v : s_less) 
        cout << v << ' ';
    cout << endl << endl;
    return 0;
}

输出的结果是:

The default set container is :
3 4 13 22 29 38 48 59 74

The greater set container is :
94 65 55 42 37 34 28 16 12 1

The less set container is :
19 21 36 57 68 70 80 81

结论1:

在set容器中,默认是降序;greater<>() 是降序;less<>() 是升序!

自定义数据类型的set容器的升序与降序
#include 
#include 
#include 
#include 
using namespace std;

struct Data {
    int id, score;
    bool operator<(const Data& rhs) const {
        if (score != rhs.score)
            return score > rhs.score;
        return id < rhs.id;
    }

    friend ostream& operator<<(ostream& out, const Data& obj);
};

ostream& operator<<(ostream& out, const Data& obj) {
    out << "id = " << obj.id << "tt" << "score = " << obj.score;
    return out;
}

int main() {
    static default_random_engine e(time(nullptr));
    static uniform_int_distribution u(1, 100);

    
    set s_self;
    for (int i = 0; i < 10; ++i) 
        s_self.insert({u(e), u(e)});
    cout << "The default set container is :" << endl;
    for (const Data& v : s_self) 
        cout << v << endl;
    cout << endl << endl;
    return 0;
}

输出的结果是:

The self-set container is :
id = 63         score = 93
id = 59         score = 84
id = 1          score = 79
id = 30         score = 70
id = 48         score = 69
id = 3          score = 57
id = 76         score = 47
id = 84         score = 31
id = 84         score = 29
id = 45         score = 22

结论2:

在set容器中,自定义的数据类型需要重载小于运算符,且重载的函数是常函数!这是因为set的对象是常对象。并且,小于运算符中,this在rhs的前面,比如这里的重载函数,当score不同时,score较大的是this排在前面,如果score相同则比较id!

基本数据类型的sort算法的升序与降序
#include 
#include 
#include 
#include 
#include 
using namespace std;

int main() {
    static default_random_engine e(time(nullptr));
    static uniform_int_distribution u(1, 100);

    
    vector vec;
    for (int i = 0; i < 10; ++i) 
        vec.push_back(u(e));
    sort(vec.begin(), vec.end());
    cout << "The defualt sort is : " << endl;
    for (int v : vec)
        cout << v << ' ';
    cout << endl << endl;
    sort(vec.begin(), vec.end(), greater());
    cout << "The greater sort is : " << endl;
    for (int v : vec)
        cout << v << ' ';
    cout << endl << endl;
    sort(vec.begin(), vec.end(), less());
    cout << "The less sort is : " << endl;
    for (int v : vec)
        cout << v << ' ';
    cout << endl << endl;
    return 0;
}

输出的结果是:

The defualt sort is : 
22 39 41 60 60 65 66 69 75 91

The greater sort is :
91 75 69 66 65 60 60 41 39 22

The less sort is :
22 39 41 60 60 65 66 69 75 91

结论3:

sort默认的排序是升序的,greater<>() 得到的是降序的,less<>() 得到的是升序的!

自定义数据类型的sort容器的升序与降序
#include 
#include 
#include 
#include 
#include 
using namespace std;

struct Data {
    int id, score;
    bool operator<(const Data& rhs) const {
        if (score != rhs.score)
            return score > rhs.score;
        return id < rhs.id;
    }

    friend ostream& operator<<(ostream& out, const Data& obj);
};

ostream& operator<<(ostream& out, const Data& obj) {
    out << "id = " << obj.id << "tt" << "score = " << obj.score;
    return out;
}

int main() {
    static default_random_engine e(time(nullptr));
    static uniform_int_distribution u(1, 100);

    
    vector vec;
    for (int i = 0; i < 10; ++i) 
        vec.push_back({u(e), u(e)});
    sort(vec.begin(), vec.end());
    cout << "The self-sort is : " << endl;
    for (const Data&v : vec)
        cout << v << endl;
    cout << endl << endl;
    return 0;
}

输出的结果是:

The self-sort is : 
id = 27         score = 92
id = 71         score = 47
id = 30         score = 44
id = 45         score = 38
id = 79         score = 25
id = 23         score = 23
id = 36         score = 19
id = 55         score = 12
id = 86         score = 7
id = 60         score = 4

结论4:

实现的方法和结论与结论2完全一样!小于运算符可以运用在,有序的,需要比较大小的容器或者算法中,切记要使用常函数实现!

基本数据类型的priority_queue的升序与降序
#include 
#include 
#include 
#include 
using namespace std;

int main() {
    static default_random_engine e(time(nullptr));
    static uniform_int_distribution u(1, 100);

    
    priority_queue q_default;
    priority_queue, greater> q_greater;
    priority_queue, less> q_less;
    for (int i = 0; i < 10; ++i) {
        q_default.push(u(e));
        q_greater.push(u(e));
        q_less.push(u(e));
    }
    cout << "The defualt priority_queue is : " << endl;
    while (!q_default.empty()) {
        cout << q_default.top() << ' ';
        q_default.pop();
    }
    cout << endl << endl;
    cout << "The greater priority_queue is : " << endl;
    while (!q_greater.empty()) {
        cout << q_greater.top() << ' ';
        q_greater.pop();
    }
    cout << endl << endl;
    cout << "The less priority_queue is : " << endl;
    while (!q_less.empty()) {
        cout << q_less.top() << ' ';
        q_less.pop();
    }
    cout << endl << endl;
    return 0;
}

输出的结果是:

The defualt priority_queue is : 
69 67 67 65 62 60 42 26 10 6

The greater priority_queue is :
1 15 17 20 47 52 54 58 82 90

The less priority_queue is :
93 75 65 60 53 29 19 16 11 2

重大总结

在sort排序、set容器,默认为升序的算法、容器中,greater是降序的!less是升序的!

在优先队列,priority_queue这种,默认为降序的容器中,greater是升序的!less是降序的!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/296652.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号