C++ std::set 带有自定义类返回错误的lower_bound值

C++ std::set With Custom Class Returning Wrong lower_bound Value

提问人:codexistent 提问时间:1/4/2023 最后编辑:codexistent 更新时间:1/4/2023 访问量:84

问:

在下面的代码中,有 class 和 ,是一组 s,我使用结构来比较其中的集合元素。 只需返回给定 ID 值的对象。 在主体上,我添加了四个元素:4 个图块,id 为 1、2、4 和 5。TileTQTiletCmp_idmkTileTileTQ

我还调用 和 on ,它们应该分别给出 2 和 4。但是,在我运行程序时,我分别得到 4 和 4 作为输出。 代码如下:upper_boundlower_boundTQ

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

class Tile {
    public:
        int id;
};
struct tCmp_id {
    bool operator()(Tile a, Tile b) const {
        return a.id < b.id;
    }
};

set<Tile, tCmp_id> TQ;

Tile mkTile(int id){
    Tile t;
    t.id = id;
    return t;
}

int main(){
    TQ.insert(mkTile(1));
    TQ.insert(mkTile(2));
    TQ.insert(mkTile(4));
    TQ.insert(mkTile(5));

    cout << (*TQ.lower_bound(mkTile(3))).id << endl;
    cout << (*TQ.upper_bound(mkTile(3))).id << endl;
}

有人可以解释一下这是怎么回事吗?我尝试过在线搜索或编辑,但到目前为止没有任何效果。提前致谢tCmp_id

C++ 设置 std 下限

评论

1赞 pm100 1/4/2023
你误解了上限和下限。您可以通过简单的set<int>
0赞 codexistent 1/4/2023
@pm100 现在知道了。几周前,我最近从 Java 切换到了 CPP,所以刚刚开始习惯它

答:

4赞 Ted Lyngmo 1/4/2023 #1

std::set::lower_bound- 返回一个迭代器,指向第一个不小于(即大于或等于)键的元素。

std::set::upper_bound- 返回一个迭代器,指向第一个大于 key 的元素。

由于您用作搜索的密钥,因此您将在这两种情况下都获得。34

for 是第一个不小于 3 的值,即它大于或等于 。lower_bound43

For 是第一个大于 的值。upper_bound43