지도 용 C++ API를 사용하여 더 쉽게 작업하려고합니다. map.erase(begin, end)
메서드를 통해 [begin, end)
사이의 모든 항목을 삭제하고 싶습니다. 그래서 내 방법이 구현되고 TabletKey
은 아래와 같이 정의됩니다.C++ map 지우기 (시작, 끝) 작동하지 않음
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'입니까? 반복기가 예상 값을 가지고 있는지 확인 했습니까? –