我试图通过使用 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
我编写了自己的comparison
函数,以重载默认方法:
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
没有按预期工作吗?我是否也必须给出 to 的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 }