iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
Software Development

C++ 實務基礎經驗系列 第 15

輔助函式 容器自定義排序

  • 分享至 

  • xImage
  •  

輔助函式 容器自定義排序

今天介紹一下C++中的兩個資料容器mapset的自定義排序

自定義排序

這類的場景是mapset本身在新增元素的時候,就有針對key的排序,setkey就針對value,但內建的排序遇到物件的時候就要需要使用自定義排序,所以可以參考以下用法

#include <iostream>
#include <map>
#include <set>
#include <string>

using namespace std;

struct Cat
{
    Cat(string name, int tail) : Name(name), TailLength(tail) {}
    string Name;
    int TailLength;

    // override 運算子 < 也行
    bool operator < (const Cat& c) const {
        return TailLength < c.TailLength;
    }
};

class CompareCat
{
    public:
    bool operator() (const Cat& c1, const Cat& c2) {
        return c1.TailLength > c2.TailLength;
    }
};

int main(int argc, char const *argv[])
{
    // map 排序只能針對key
    map<Cat, int, CompareCat> catOrderByTailDesc;
    catOrderByTailDesc.insert(make_pair(Cat("meme", 2), 2));
    catOrderByTailDesc.insert(make_pair(Cat("kitty", 35), 6));
    catOrderByTailDesc.insert(make_pair(Cat("zupi", 9), 5));
    
    for (auto &cat : catOrderByTailDesc)
    {
        cout << cat.first.Name << " " << cat.first.TailLength << endl;
    }

    // set 也一樣
    set<Cat, CompareCat> catOrderByTailDescSet;
    catOrderByTailDescSet.insert(Cat("meme", 2));
    catOrderByTailDescSet.insert(Cat("kitty", 35));
    catOrderByTailDescSet.insert(Cat("zupi", 9));
    
    for (auto &cat : catOrderByTailDescSet)
    {
        cout << cat.Name << " " << cat.TailLength << endl;
    }

    // override
    set<Cat> catOverride;
    catOverride.insert(Cat("meme", 2));
    catOverride.insert(Cat("kitty", 35));
    catOverride.insert(Cat("zupi", 9));
    for (auto &cat : catOrderByTailDescSet)
    {
        cout << cat.Name << " " << cat.TailLength << endl;
    }

    return 0;
}

參考

C++ set自定义排序


上一篇
輔助函式 crash log
下一篇
排序演算法 1
系列文
C++ 實務基礎經驗25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言