gpt4 book ai didi

c++ - 如何初始化一个类数据成员,它是一个带有自定义比较器的 std::set

转载 作者:行者123 更新时间:2023-11-28 04:12:02 50 4
gpt4 key购买 nike

当它是类数据成员时,我不太确定使用自定义比较器初始化标准集的正确方法是什么。一旦我添加了将列表迭代器插入集合的行,下面的代码就会导致编译失败。我不确定为什么。

#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 中成功编译了显示的代码。

关于c++ - 如何初始化一个类数据成员,它是一个带有自定义比较器的 std::set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57503685/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com