gpt4 book ai didi

C++ 映射删除(开始、结束)不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 15:05:02 25 4
gpt4 key购买 nike

我正在尝试通过使用 C++ API 来简化我的生活。通过 map.erase(begin, end) 方法,我希望删除 [begin, end) 之间的所有条目。所以我的方法实现了TabletKey 定义如下。

 79 void
80 ObjectFinder::flush(uint64_t tableId) {
81
82 RAMCLOUD_TEST_LOG("flushing object map");
83 std::map<TabletKey, ProtoBuf::Tablets::Tablet>::iterator lower;
84 std::map<TabletKey, ProtoBuf::Tablets::Tablet>::iterator upper;
85 std::map<TabletKey, ProtoBuf::Tablets::Tablet>::iterator it;
86 KeyHash keyHash = Key::getHash(tableId, "", 0);
87 TabletKey key(tableId, keyHash);
88
89 std::cout << "before the loop" << std::endl;
90 for (it = tableMap.begin(); it != tableMap.end(); it++) {
91 std::cout << it->first.first << std::endl;
92 }
93 lower = tableMap.lower_bound(key);
94 upper = tableMap.upper_bound(key);
95
108 tableMap.erase(lower, upper);
109 std::cout << "After the erase" << std::endl;
110 for (it = tableMap.begin(); it != tableMap.end(); it++) {
111 std::cout << it->first.first << std::endl;
112 }
}

但是,id 值没有被删除:

id = 99
before the loop
1
99
After the erase
1
99

我写了自己的比较函数,重载默认方法:

 35 typedef std::pair<uint64_t, KeyHash> TabletKey;
36
37 /*
38 * The object CmpTabletKey is used to override the default comparison
39 * definition from the C++ Map.
40 */
41 struct CmpTabletKey {
42 bool operator()(const TabletKey& key1, const TabletKey& key2) const {
43 return ((key1.first < key2.first) ||
44 (key1.first == key2.first && key1.second < key2.second));
}
}

有人能告诉我为什么 erase 没有按预期工作吗?我是否也必须将 CmpTabletKey 的定义也提供给 iterator更新这是我的旧实现:它工作得很好,可以做我想做的事:但是,这是一个 O(n) 方法,我想要一个更快的实现:

117     std::map<TabletKey, ProtoBuf::Tablets::Tablet>::iterator it;
118 for (it = tableMap.begin(); it != tableMap.end(); ) {
119 if (tableId == it->first.first) {
120 tableMap.erase((it++)->first);
121 } else {
122 ++it;
123 }
124 }

最佳答案

从迭代器的定义方式来看,您似乎没有使用自定义比较器创建 map 。

我认为应该将 map 创建为:

std::map<TabletKey, ProtoBuf::Tablets::Tablet, CmpTabletKey > tableMap; //CmpTabletKey is passed as the comparator type

And your iterators become:
std::map<TabletKey, ProtoBuf::Tablets::Tablet, CmpTabletKey>::iterator lower;
std::map<TabletKey, ProtoBuf::Tablets::Tablet, CmpTabletKey>::iterator upper;
std::map<TabletKey, ProtoBuf::Tablets::Tablet, CmpTabletKey>::iterator it;

如果您不指定 CmpTabletKey 作为类型,您的 map 将使用默认比较器。

关于C++ 映射删除(开始、结束)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18005599/

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