我想通過使用C++ API來實現我的生活。通過map.erase(begin, end)
方法,我希望刪除[begin, end)
之間的所有條目。所以我的方法實現了,下面定義了 TabletKey
。C++地圖擦除(開始,結束)不起作用
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
無法按預期工作?我是否也必須將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 }
什麼是「tableMap」? – maditya
它是一個'TabletKey'和一個對象之間的'C++'映射 – cybertextron
你爲什麼指責'erase'?你甚至檢查過迭代器是否有預期的值? –