[英]How to use a std::set as a data member with an explicit comparator member function?
[英]How to initialize a class data member which is a std::set with custom comparator
我不太確定當它是一個類數據成員時,用自定義比較器初始化一個std集的正確方法是什么。 在將行添加列表迭代器添加到集合中之后,以下代碼使我編譯失敗。 我不知道為什么。
#include <list>
#include <set>
#include <iterator>
auto pred = [](auto const& v1, auto const& v2) {
*v1 < *v2;
};
using LstIter = std::list<int>::iterator;
class MaxStack {
public:
MaxStack()
:valLst(),
valSet(pred)
{}
void push(int x) {
valLst.push_back(x);
LstIter it = std::prev(valLst.end());
// this line causes compile failure
valSet.insert(it);
}
private:
std::list<int> valLst;
std::set<LstIter, decltype(pred)> valSet;
};
現在的問題是我忘了在lambda中鍵入return。 我不敢相信是這樣,我已經看了10分鍾的代碼,但仍然沒有看到它。
但是,如果那是錯誤的話,那就是一個更有趣的問題。 為什么在類構造函數代碼期間編譯器不會出錯。 第一次嘗試調用比較器時會失敗。 構造集合時,編譯器不應該檢查比較器簽名嗎?
auto pred = [](auto const& v1, auto const& v2) {
*v1 < *v2;
};
將明顯的胖手指固定為應有的樣子:
auto pred = [](auto const& v1, auto const& v2) {
return *v1 < *v2;
};
結果在gcc 9中成功編譯了顯示的代碼。
std::set
期望其比較器返回bool
。 但是pred
是一個void
函數,它實際上不返回任何值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.