stl的比較器:自定義數據排序方式,set忽略大小寫

stl自定義的比較器主要用於實現容器中元素的比較。比較器的定義的方式主要有下面三種:

1.普通函數

對vector數值進行降序排序
sort默認是升序的,這裏通過cmp函數改成降序排序。如果將cmp的返回值改成a<b就還是升序。

bool cmp(int a, int b) {
    return a > b;
}

int main() {
    std::vector<int> data {1, 6, 3, 5, 9 ,20};
    std::sort(data.begin(), data.end(), cmp);
    for_each(data.begin(), data.end(), [](int i){std::cout << i << std::endl; });
    return 0;
}

對vector字符串進行反字典排序
sort默認是字典序的,這裏通過cmp函數改成降序排序。如果將cmp的返回值改成a<b就還是字典序。

bool cmp(std::string a, std::string b) {
    return a > b;
}

int main() {
    std::vector<std::string> name_list{"zhoujielun", "linjunjie", "axin", "xiaojingteng"};
    std::sort(name_list.begin(), name_list.end(), cmp);
    for_each(name_list.begin(), name_list.end(), [](std::string i){std::cout << i << std::endl; });
    return 0;
}

2.定義全局的operator<

適用於一些自定義的類型,根據其中一個屬性進行排序
例如將根據同學的分數,降序排列

struct Person{
    Person(std::string name, float score)
        :name_(name), score_(score) {}
	std::string name_;
	float score_;
};

bool operator<(const Person a, const Person b) {
    return a.score_ > b.score_;
}

int main() {
    std::vector<Person> data {{"zhangsan", 90}, {"lisilisi", 70}, {"wanger", 65}, {"xiaowu", 95}};
    std::sort(data.begin(), data.end());
    for_each(data.begin(), data.end(), [](Person i){std::cout << i.name_ << ":" << i.score_ << std::endl; });
    return 0;
}

3.仿函數

仿函數是可調用對象的一種,是指一個具有operator()成員函數的類對象
前面都是舉例的排序,下面將set改爲忽略大小寫,即對字符串的大小寫不敏感

struct Cmp {
    bool operator()(std::string const&a, std::string const& b) const {
        return strcasecmp(a.c_str(), b.c_str()) < 0;
    }
};

int main() {
    std::set<std::string, Cmp> name_list{"zhoujielun", "linjunjie", "axin", "xiaojingteng"};
    for_each(name_list.begin(), name_list.end(), [](std::string i){std::cout << i << std::endl; });

    name_list.insert("ZHoujieLun");
    name_list.insert("ZHOUJIELUN");
    name_list.insert("ZHoujieLUN");
    for_each(name_list.begin(), name_list.end(), [](std::string i){std::cout << i << std::endl; });
    return 0;
}

可以看到前後兩次輸出都是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章