gpt4 book ai didi

c++ - std::set 在使用 std::set.erase 后包含重复元素

转载 作者:行者123 更新时间:2023-12-02 10:08:51 29 4
gpt4 key购买 nike

嗯,我需要设计一个玩家计时器,每个玩家每 30 分钟执行一次。

我没有循环所有播放器,而是创建了 std::set<std::pair<playerid,last_time_executed>> (两者都是整数 std::set<std::pair<int,int>> )和:

  • 我知道如何按时间值排序,
  • 我知道如何插入元素而不插入重复的 playerid(集合中的一个 playerid)

  • 但是我不知道如何仅通过 playerid 删除元素,所以我用我的大脑选择的随机值做了一些测试,结果:
    #include <iostream>
    #include <set>

    typedef std::pair<int, int> Pair;
    struct Cmp{bool operator ()(const Pair &a, const Pair &b){return a.second < b.second;}};
    std::set<Pair, Cmp> myset;

    int main() {

    myset.insert(Pair(0, 5));
    myset.insert(Pair(1, 0));
    myset.insert(Pair(1, 1));
    myset.erase(Pair(0, 698));

    std::cout << myset.size() << std::endl;
    for (auto i : myset)
    std::cout << "(" << i.first << "," << i.second << ")" << std::endl;
    return 0;
    }

    这实际上打印....(注意重复的 id '1')

    3
    (1,0)
    (1,1)
    (0,5)

    虽然这样:
    int main() {

    myset.insert(Pair(0, 5));
    myset.insert(Pair(1, 0));
    myset.insert(Pair(1, 1));

    std::cout << myset.size() << std::endl;
    for (auto i : myset)
    std::cout << "(" << i.first << "," << i.second << ")" << std::endl;
    return 0;
    }

    打印这个(没有重复的 id?):

    2
    (1,1)
    (0,5)

    更奇怪的是(!)现在,这个:
    int main() {

    myset.insert(Pair(0, 5));
    myset.insert(Pair(1, 0));
    myset.insert(Pair(1, 1));
    myset.erase(Pair(0, 0));
    std::cout << myset.size() << std::endl;
    for (auto i : myset)
    std::cout << "(" << i.first << "," << i.second << ")" << std::endl;
    return 0;
    }

    打印这个(没有重复的 id?):

    2
    (1,1)
    (0,5)

    这真的很令人惊讶,因为我期望与第一次测试中的输出相同。

    为什么会这样?

    最佳答案

    您的比较谓词仅比较 second对的字段。

    第一个字段中的“碰撞”无关紧要。

    更改它以获得您描述的行为:

    struct Cmp {
    bool operator()(const Pair &a, const Pair &b) { return a.first < b.first; }
    };

    Live On Coliru

    此外,正如其他人所注意到的,这更像是 std::map<idtype, valuetype> :

    Live On Coliru
    #include <iostream>
    #include <map>

    std::map<int, int> myset;

    int main() {

    mymap.emplace(0, 5);
    mymap.emplace(1, 0);
    mymap.emplace(1, 1);
    mymap.erase(0);

    std::cout << myset.size() << std::endl;
    for (auto i : myset)
    std::cout << "(" << i.first << "," << i.second << ")" << std::endl;
    return 0;
    }

    请注意,要实际更新(现有)键的值:
        mymap[0] = 5;
    mymap[1] = 0;
    mymap[1] = 1;

    关于c++ - std::set 在使用 std::set.erase 后包含重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27026873/

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