簡體   English   中英

如何使用自定義比較器初始化為std :: set的類數據成員

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM