Tips!如何在set裏存放進自定義的結構體?

這個問題是在我寫Leetcode-141忽然萌生出的小問號:
判斷一個鏈表有沒有環,如今能看到的作法通常有兩種:一個是快慢指針,另外一個是每遇到一個Node就把他的地址存進set中,若是find(a)!=s.end();就表示出現了環。咱們在新建set通常是這樣寫:set<LinkList*> s;表明容器裏存放的是地址。那麼,我能不能往裏面直接存Node呢?
應該是能夠的,可是因爲插入的類型是自定義的,非基本類型。而set/map這類容器是自動排序的,基本類型有默認的排序規則,可是自定義的沒有,所以咱們須要重載<運算符,至關於給自定義類型一個排序準則。ios

#include <iostream>
#include <set>
using namespace std;

typedef struct Node{
    int val;
    struct Node *next;
} LinkNode, *LinkList;

bool operator<(const LinkNode &a,const LinkNode &b){
    return a.next < b.next;
}

int main(){
    set<LinkNode> s;
    LinkNode a,b,c;
    a.val = 1;
    b.val = 2;
    c.val = 3;
    a.next = &b;
    b.next = &c;
    c.next = NULL;
    s.insert(a);
    s.insert(b);
    s.insert(c);

    for (set<LinkNode>::iterator iter = s.begin(); iter != s.end();++iter){
         cout << iter->val<< endl;
    }
    
}

輸出結果是:3,1,2
所以咱們知道鏈表結點已被放進set且完成了自動排序,順序是c,a,b。spa

相關文章
相關標籤/搜索