13 template <
typename TKey,
typename TValue>
18 bool insert(TKey key, TValue* value);
37 template <
typename TKey,
typename TValue>
49 template <
typename TKey,
typename TValue>
55 _root->keys.push_back(key);
56 _root->values.push_back(*value);
60 if (_root->keys.size() == 2 * _keysMax - 1)
64 splitChild(newRoot, 0, _root);
67 insertNonFull(_root, key, value);
77 template <
typename TKey,
typename TValue>
80 if (_root ==
nullptr) {
84 if (_root->keys.empty() && !_root->isLeaf) {
98 template <
typename TKey,
typename TValue>
110 while (i < current->keys.size() && key >= current->
keys[i])
115 for (
size_t i = 0; i < current->
keys.size(); ++i)
117 if (current->
keys[i] == key)
118 return ¤t->
values[i];
124 template <
typename TKey,
typename TValue>
125 void BPlusTree<TKey, TValue>::splitChild(
133 parent->
children.begin() + index + 1,
137 parent->
keys.begin() + index,
138 child->
keys[_keysMax - 1]);
140 newChild->
keys.assign(
141 child->
keys.begin() + _keysMax,
144 child->
keys.resize(_keysMax - 1);
157 child->
next = newChild;
161 template <
typename TKey,
typename TValue>
162 void BPlusTree<TKey, TValue>::insertNonFull(
169 auto pos = std::upper_bound(
173 size_t index = std::distance(node->keys.begin(), pos);
174 node->keys.insert(pos, key);
175 node->values.insert(node->values.begin() + index, *value);
179 int i = node->keys.size() - 1;
181 while (i >= 0 && key < node->keys[i])
186 if (node->children[i]->keys.size() == 2 * _keysMax - 1)
188 splitChild(node, i, node->children[i]);
190 if (key > node->keys[i])
194 insertNonFull(node->children[i], key, value);
198 template <
typename TKey,
typename TValue>
210 if (it != node->keys.end())
212 size_t index = std::distance(node->keys.begin(), it);
213 node->keys.erase(it);
214 node->values.erase(node->values.begin() + index);
219 int index = std::distance(
226 if (index < node->keys.size() && node->keys[index] == key)
228 if (node->children[index]->keys.size() >= _keysMax)
231 while (!predecessorNode->isLeaf)
232 predecessorNode = predecessorNode->children.back();
234 TKey predecessorKey = predecessorNode->keys.back();
235 TValue predecessorVal = predecessorNode->values.back();
236 node->keys[index] = predecessorKey;
237 node->values[index] = predecessorVal;
239 remove(node->children[index], predecessorKey);
241 else if (node->children[index + 1]->keys.size() >= _keysMax)
244 while(!successorNode->isLeaf)
245 successorNode = successorNode->children.front();
247 TKey successorKey = successorNode->keys.front();
248 TValue successorVal = successorNode->values.front();
249 node->keys[index] = successorKey;
250 node->values[index] = successorVal;
252 remove(node->children[index + 1], successorKey);
257 remove(node->children[index], key);
262 if (node->children[index]->keys.size() < _keysMax)
265 node->children[index - 1]->keys.size() >= _keysMax)
266 borrowFromPrev(node, index);
267 else if (index < node->children.size() - 1 &&
268 node->children[index + 1]->keys.size() >= _keysMax)
269 borrowFromNext(node, index);
272 if (index < node->children.size() -1)
275 merge(node, index - 1);
278 remove(node->children[index], key);
283 template <
typename TKey,
typename TValue>
284 void BPlusTree<TKey, TValue>::merge(
291 child->keys.push_back(node->keys[index]);
292 child->values.push_back(node->values[index]);
296 sibling->keys.begin(),
297 sibling->keys.end());
298 child->values.insert(
300 sibling->values.begin(),
301 sibling->values.end());
305 child->children.insert(child->children.end(),
306 sibling->children.begin(),
307 sibling->children.end());
310 node->keys.erase(node->keys.begin() + index);
311 node->values.erase(node->values.begin() + index);
312 node->children.erase(node->children.begin() + index + 1);
317 template <
typename TKey,
typename TValue>
318 void BPlusTree<TKey, TValue>::borrowFromPrev(
325 child->keys.insert(child->keys.begin(), node->keys[index - 1]);
326 child->values.insert(child->values.begin(), node->values[index - 1]);
328 node->keys[index - 1] = sibling->keys.back();
329 node->values[index - 1] = sibling->values.back();
331 sibling->keys.pop_back();
332 sibling->values.pop_back();
334 if (!child->isLeaf) {
335 child->children.insert(child->children.begin(), sibling->children.back());
336 sibling->children.pop_back();
340 template <
typename TKey,
typename TValue>
341 void BPlusTree<TKey, TValue>::borrowFromNext(
348 child->keys.push_back(node->keys[index]);
349 child->values.push_back(node->values[index]);
351 node->keys[index] = sibling->keys.front();
352 node->values[index] = sibling->values.front();
354 sibling->keys.erase(sibling->keys.begin());
355 sibling->values.erase(sibling->values.begin());
357 if (!child->isLeaf) {
358 child->children.push_back(sibling->children.front());
359 sibling->children.erase(sibling->children.begin());