13 template <
typename TKey,
typename TValue>
29 bool insert(TKey key, TValue* value);
93 template <
typename TKey,
typename TValue>
99 template <
typename TKey,
typename TValue>
102 if (_root ==
nullptr)
105 _root->keys.push_back(key);
106 _root->values.push_back(*value);
110 if (_root->keys.size() == 2 * _keysMax - 1)
114 splitChild(newRoot, 0, _root);
117 insertNonFull(_root, key, value);
122 template <
typename TKey,
typename TValue>
125 if (_root ==
nullptr) {
129 if (_root->keys.empty() && !_root->isLeaf) {
138 template <
typename TKey,
typename TValue>
150 while (i < current->keys.size() && key >= current->
keys[i])
155 for (
size_t i = 0; i < current->
keys.size(); ++i)
157 if (current->
keys[i] == key)
158 return ¤t->
values[i];
164 template <
typename TKey,
typename TValue>
165 void BPlusTree<TKey, TValue>::splitChild(
173 parent->
children.begin() + index + 1,
177 parent->
keys.begin() + index,
178 child->
keys[_keysMax - 1]);
180 newChild->
keys.assign(
181 child->
keys.begin() + _keysMax,
184 child->
keys.resize(_keysMax - 1);
197 child->
next = newChild;
201 template <
typename TKey,
typename TValue>
202 void BPlusTree<TKey, TValue>::insertNonFull(
209 auto pos = std::upper_bound(
213 size_t index = std::distance(node->keys.begin(), pos);
214 node->keys.insert(pos, key);
215 node->values.insert(node->values.begin() + index, *value);
219 int i = node->keys.size() - 1;
221 while (i >= 0 && key < node->keys[i])
226 if (node->children[i]->keys.size() == 2 * _keysMax - 1)
228 splitChild(node, i, node->children[i]);
230 if (key > node->keys[i])
234 insertNonFull(node->children[i], key, value);
238 template <
typename TKey,
typename TValue>
250 if (it != node->keys.end())
252 size_t index = std::distance(node->keys.begin(), it);
253 node->keys.erase(it);
254 node->values.erase(node->values.begin() + index);
259 int index = std::distance(
266 if (index < node->keys.size() && node->keys[index] == key)
268 if (node->children[index]->keys.size() >= _keysMax)
271 while (!predecessorNode->isLeaf)
272 predecessorNode = predecessorNode->children.back();
274 TKey predecessorKey = predecessorNode->keys.back();
275 TValue predecessorVal = predecessorNode->values.back();
276 node->keys[index] = predecessorKey;
277 node->values[index] = predecessorVal;
279 remove(node->children[index], predecessorKey);
281 else if (node->children[index + 1]->keys.size() >= _keysMax)
284 while(!successorNode->isLeaf)
285 successorNode = successorNode->children.front();
287 TKey successorKey = successorNode->keys.front();
288 TValue successorVal = successorNode->values.front();
289 node->keys[index] = successorKey;
290 node->values[index] = successorVal;
292 remove(node->children[index + 1], successorKey);
297 remove(node->children[index], key);
302 if (node->children[index]->keys.size() < _keysMax)
305 node->children[index - 1]->keys.size() >= _keysMax)
306 borrowFromPrev(node, index);
307 else if (index < node->children.size() - 1 &&
308 node->children[index + 1]->keys.size() >= _keysMax)
309 borrowFromNext(node, index);
312 if (index < node->children.size() -1)
315 merge(node, index - 1);
318 remove(node->children[index], key);
323 template <
typename TKey,
typename TValue>
324 void BPlusTree<TKey, TValue>::merge(
331 child->keys.push_back(node->keys[index]);
332 child->values.push_back(node->values[index]);
336 sibling->keys.begin(),
337 sibling->keys.end());
338 child->values.insert(
340 sibling->values.begin(),
341 sibling->values.end());
345 child->children.insert(child->children.end(),
346 sibling->children.begin(),
347 sibling->children.end());
350 node->keys.erase(node->keys.begin() + index);
351 node->values.erase(node->values.begin() + index);
352 node->children.erase(node->children.begin() + index + 1);
357 template <
typename TKey,
typename TValue>
358 void BPlusTree<TKey, TValue>::borrowFromPrev(
365 child->keys.insert(child->keys.begin(), node->keys[index - 1]);
366 child->values.insert(child->values.begin(), node->values[index - 1]);
368 node->keys[index - 1] = sibling->keys.back();
369 node->values[index - 1] = sibling->values.back();
371 sibling->keys.pop_back();
372 sibling->values.pop_back();
374 if (!child->isLeaf) {
375 child->children.insert(child->children.begin(), sibling->children.back());
376 sibling->children.pop_back();
380 template <
typename TKey,
typename TValue>
381 void BPlusTree<TKey, TValue>::borrowFromNext(
388 child->keys.push_back(node->keys[index]);
389 child->values.push_back(node->values[index]);
391 node->keys[index] = sibling->keys.front();
392 node->values[index] = sibling->values.front();
394 sibling->keys.erase(sibling->keys.begin());
395 sibling->values.erase(sibling->values.begin());
397 if (!child->isLeaf) {
398 child->children.push_back(sibling->children.front());
399 sibling->children.erase(sibling->children.begin());