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

epfja78i  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(164)

在下面的代码中,有类TileTQTile的集合,其中我使用结构tCmp_id来比较集合元素。mkTile简单地返回一个给定id值的Tile对象。在main中,我向TQ添加了四个元素:4个图块,ID分别为1、2、4和5。
我还在TQ上调用了upper_boundlower_bound,它们应该分别给予2和4,但是,在我运行程序时,我得到的输出分别是4和4,代码如下:

#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,但到目前为止什么都不起作用。提前感谢

ogq8wdun

ogq8wdun1#

std::set::lower_bound-返回一个迭代器,指向第一个不小于(即大于或等于)key的元素。
std::set::upper_bound-返回一个迭代器,指向第一个大于key的元素。
由于使用3作为要搜索的键,因此在两种情况下都将得到4
对于lower_bound4是不小于3的第一个值,即它大于或等于3
对于upper_bound4是第一个大于3的值。

相关问题