std::map::extract(3)
okay bestie, this is the std::map::extract(3) page from the C++ Standard Libary manual β yes, that spelling is exactly what it says, and we are keeping every detail, no cap πβ¨
πΈ NAME πΈ
std::map::extract β std::map::extract. That's the whole name section, short and iconic π
β¨ Synopsis β¨
node_type extract( const_iterator position ); (1) (since C++17)
node_type extract( const Key& k ); (2) (since C++17)
template< class K > (3) (since C++23)
node_type extract( K&& x );
(1)unlinks the node that contains the element pointed to bypositionand returns a node handle that owns it.(2)if the container has an element with key equivalent tok, unlinks the node that contains that element from the container and returns a node handle that owns it. Otherwise, returns an empty node handle.(3)same as(2). This overload participates in overload resolution only if the qualified-idCompare::is_transparentis valid and denotes a type, and neitheriteratornorconst_iteratoris implicitly convertible fromK. It allows calling this function without constructing an instance ofKey.
In either case, no elements are copied or moved β only the internal pointers of the container nodes are repointed (rebalancing may occur, as with erase()). Literally just pointer glow-up energy π¦
Extracting a node invalidates only the iterators to the extracted element. Pointers and references to the extracted element remain valid, but cannot be used while the element is owned by a node handle: they become usable if the element is inserted into a container.
π Parameters π
positionβ a valid iterator into this container.kβ a key to identify the node to be extracted.xβ a value of any type that can be transparently compared with a key identifying the node to be extracted.
π Return value π
A node handle that owns the extracted element, or empty node handle in case the element is not found in (2,3).
π₯ Exceptions π₯
(1)throws nothing. Nothing at all, bestie π«Ά(2,3)any exceptions thrown by theCompareobject.
β Complexity β
(1)amortized constant.(2,3)log(size()).
π¦ Notes π¦
extract is the only way to change a key of a map element without reallocation. This is the main character fact, iykyk π
std::map<int, std::string> m{{1, "mango"}, {2, "papaya"}, {3, "guava"}};
auto nh = m.extract(2);
nh.key() = 4;
m.insert(std::move(nh));
// m == {{1, "mango"}, {3, "guava"}, {4, "papaya"}}
π Feature-test macro π
- Feature-test macro:
__cpp_lib_associative_heterogeneous_erasure - Value:
202110L - Std:
(C++23) - Feature: Heterogeneous erasure in associative containers and unordered associative containers,
(3)
π Example π
// Run this code
#include <algorithm>
#include <iostream>
#include <string_view>
#include <map>
void print(std::string_view comment, const auto& data)
{
std::cout << comment;
for (auto [k, v] : data)
std::cout << ' ' << k << '(' << v << ')';
std::cout << '\n';
}
int main()
{
std::map<int, char> cont{{1, 'a'}, {2, 'b'}, {3, 'c'}};
print("Start:", cont);
// Extract node handle and change key
auto nh = cont.extract(1);
nh.key() = 4;
print("After extract and before insert:", cont);
// Insert node handle back
cont.insert(std::move(nh));
print("End:", cont);
}
πΈ Output πΈ
Start: 1(a) 2(b) 3(c)
After extract and before insert: 2(b) 3(c)
End: 2(b) 3(c) 4(a)
π See also π
mergeβ splices nodes from another container(C++17)(public member function).insertβ inserts elements or nodes(since C++17)(public member function).eraseβ erases elements (public member function).
okay bestie, that's the whole page β source/version: http://cppreference.com, date: 2024.06.10, page: std::map::extract(3). Stay slay and keep your node handles safe πβ¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms