2016-03-01 62 views
0

下面的代碼給出了分段錯誤,有人能夠啓發我嗎?我想要實現的是按照tv.t的升序或tv.m的降序排列優先級隊列。priority_queue emplace給出分段錯誤

struct tv { 
    int m; 
    int c; 
    int t; 
    tv(int mm, int cc, int tt): m(mm), c(cc), t(tt) {} 
}; 


bool comp(struct tv & t1 , struct tv & t2) { 
    if (t1.t == t2.t) { 
     return t1.m < t2.m; 
    } 
    return t1.t > t2.t; 
} 


int main(int argc, char** argv) { 
    priority_queue<struct tv, vector<struct tv>, decltype(&comp)> q; 
    q.emplace(0, 0, 0); 
    q.emplace(1, 0, 0); 
    q.emplace(1, 1, 1); 
    q.emplace(1, 2, 0); 
    return 0; 
} 

回答

2

你給你的優先級隊列模板參數列表比較類型,但是你沒有給它在構造函數中的實際比較。

priority_queue<tv, vector<tv>, decltype(&comp)> q(comp); 

正如你所知,它正在調用一個空函數指針。這是使用函數對象而不是函數指針的好處。他們可以默認構建並做正確的事情。

struct comp_t { 
    bool operator()(const tv & t1 , const tv & t2) const { 
     if (t1.t == t2.t) { 
      return t1.m < t2.m; 
     } 
     return t1.t > t2.t; 
    } 
}; 

priority_queue<tv, vector<tv>, comp_t> q;