C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- std::array
- std::vector
- std::map
- std::map<Key,T,Compare,Allocator>::emplace
- std::map<Key,T,Compare,Allocator>::get_allocator
- std::map<Key,T,Compare,Allocator>::at
- std::map<Key,T,Compare,Allocator>::operator[]
- std::map<Key,T,Compare,Allocator>::begin, std::map<Key,T,Compare,Allocator>::cbegin
- std::map<Key,T,Compare,Allocator>::end, std::map<Key,T,Compare,Allocator>::cend
- std::map<Key,T,Compare,Allocator>::extract
- std::map<Key,T,Compare,Allocator>::merge
- std::map<Key,T,Compare,Allocator>::try_emplace
- std::map<Key,T,Compare,Allocator>::insert_or_assign
- std::map<Key,T,Compare,Allocator>::clear
- std::map<Key,T,Compare,Allocator>::map
- std::map<Key,T,Compare,Allocator>::~map
- std::map<Key,T,Compare,Allocator>::operator=
- std::map<Key,T,Compare,Allocator>::rbegin, std::map<Key,T,Compare,Allocator>::crbegin
- std::map<Key,T,Compare,Allocator>::rend, std::map<Key,T,Compare,Allocator>::crend
- std::map<Key,T,Compare,Allocator>::empty
- std::map<Key,T,Compare,Allocator>::size
- std::map<Key,T,Compare,Allocator>::max_size
- std::map<Key,T,Compare,Allocator>::insert
- std::map<Key,T,Compare,Allocator>::emplace_hint
- std::map<Key,T,Compare,Allocator>::erase
- std::map<Key,T,Compare,Allocator>::swap
- std::map<Key,T,Compare,Allocator>::count
- std::map<Key,T,Compare,Allocator>::find
- std::map<Key,T,Compare,Allocator>::contains
- std::map<Key,T,Compare,Allocator>::equal_range
- std::map<Key,T,Compare,Allocator>::lower_bound
- std::map<Key,T,Compare,Allocator>::upper_bound
- std::map<Key,T,Compare,Allocator>::key_comp
- std::map<Key,T,Compare,Allocator>::value_comp
- std::swap(std::map)
- std::erase_if (std::map)
- operator==,!=,<,<=,>,>=,<=>(std::map)
- std::map çæ¨å¯¼æå¼
- std::map<Key,T,Compare,Allocator>::value_compare
- std::unordered_map
- std::priority_queue
- std::span
- std::forward_list
- std::deque
- std::list
- std::set
- std::multiset
- std::multimap
- std::unordered_set
- std::unordered_multiset
- std::unordered_multimap
- std::stack
- std::queue
- std::vector<bool>
- ç»ç¹ææ (C++17)
- 注é
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >容å¨åº >std::map > std::map<Key,T,Compare,Allocator>::insert
std::map<Key,T,Compare,Allocator>::insert
è¥å®¹å¨å°æªå«æå¸¦çä»·å ³é®çå ç´ ï¼åæå ¥å ç´ å°å®¹å¨ä¸ã
value ãéè½½ (2) çä»·äº emplace(std::forward<P>(value)) ï¼ä¸ä»
è¥ std::is_constructible<value_type, P&&>::value == true æåä¸éè½½å³è®®ãvalue å°å°½å¯è½æ¥è¿ï¼æ°å¥½åäº(C++11 èµ·) hint çä½ç½®ãéè½½ (4) çä»·äº emplace_hint(hint, std::forward<P>(value)) ï¼ä¸ä»
è¥ std::is_constructible<value_type, P&&>::value == true æåä¸éè½½å³è®®ã[first, last) çå
ç´ ãè¥èå´ä¸çå¤ä¸ªå
ç´ æ¥ææ¯è¾çä»·çå
³é®ï¼åæå
¥åªä¸ªå
ç´ æ¯æªæå®çï¼å¾
å³ç LWG2844 ï¼ãilist çå
ç´ ãè¥èå´ä¸çå¤ä¸ªå
ç´ æ¥ææ¯è¾çä»·çå
³é®ï¼åæå
¥åªä¸ªå
ç´ æ¯æªæå®çï¼å¾
å³ç LWG2844 ï¼ãnh æ¯ç©ºçç»ç¹ææï¼åä¸åä»»ä½äºãå¦åæå
¥ nh æå æçå
ç´ å°å®¹å¨ï¼è¥å®¹å¨å°æªå«ææ¥æçä»·äº nh.key() çå
³é®çå
ç´ ãè¥ nh éç©ºä¸ get_allocator() != nh.get_allocator() åè¡ä¸ºæªå®ä¹ãnh æ¯ç©ºçç»ç¹ææï¼åä¸åä»»ä½äºå¹¶è¿åå°¾è¿ä»£å¨ãå¦åï¼æå
¥ nh æå æçå
ç´ å°å®¹å¨ï¼è¥å®¹å¨å°æªå«ææ¥æçä»·äº nh.key() çå
³é®çå
ç´ ï¼å¹¶è¿åæåæ¥æçäº nh.key() çå
³é®çå
ç´ çè¿ä»£å¨ï¼æ å
³ä¹æå
¥æåè¿æ¯å¤±è´¥ï¼ãè¥æå
¥æåï¼åä» nh ç§»å¨ï¼å¦åå®ä¿æè¯¥å
ç´ çæææãå
ç´ è¢«æå
¥å°å°½å¯è½æ¥è¿æ£å¥½å
äº hint çä½ç½®ãè¥ nh éç©ºä¸ get_allocator() != nh.get_allocator() åè¡ä¸ºæªå®ä¹ã没æè¿ä»£å¨æå¼ç¨è¢«éæ³åãè¥æå ¥æåï¼åå¨ç»ç¹ææä¿æå ç´ æ¶è·å¾çæå该å ç´ çæéåå¼ç¨è¢«éæ³åï¼è卿ååè·å¾çæåå ç´ çæéåå¼ç¨åå¾åæ³ã (C++17 èµ·)
åæ°
| hint | - |
| ||||
| value | - | è¦æå ¥çå¼ | ||||
| first, last | - | è¦æå ¥çå ç´ èå´ | ||||
| ilist | - | æå ¥å¼æ¥æºç initializer_list | ||||
| nh | - | å ¼å®¹çç»ç¹ææ | ||||
| ç±»åè¦æ± | ||||||
-InputIt å¿
须满足éçè¾å
¥è¿ä»£å¨ (LegacyInputIterator) çè¦æ±ã
| ||||||
è¿åå¼
insert_return_type ï¼å
¶æååå§åå¦ä¸ï¼è¥ nh 为空ï¼å inserted 为 false ï¼ position 为 end() ï¼è node 为空ãå¦ååçæå
¥ï¼ inserted 为 true ï¼ position æå被æå
¥å
ç´ ï¼è node 为空ãè¥æå
¥å¤±è´¥ï¼å inserted 为 false ï¼ node æ¥æ nh çå
åå¼ï¼è position æåæ¥æçä»·äº nh.key() çå
³é®çå
ç´ ãnh 为空å为尾è¿ä»£å¨ï¼è¥æå
¥åçå为æå被æå
¥å
ç´ çè¿ä»£å¨ï¼èè¥æå
¥å¤±è´¥å为æåæ¥æçä»·äº nh.key() çå
³é®çå
ç´ çè¿ä»£å¨ãå¼å¸¸
å¤æåº¦
O(log(size())) ã|
4-6) è¥æå
¥æ°å¥½åçå¨ hint åçä½ç½®å为åæå¸¸æ°ï¼å¦åä¸å®¹å¨å¤§å°æå¯¹æ°ã
|
(C++11 å) |
|
4-6) è¥æå
¥æ°å¥½åçå¨ hint åçä½ç½®å为åæå¸¸æ°ï¼å¦åä¸å®¹å¨å¤§å°æå¯¹æ°ã
|
(C++11 èµ·) |
O(N*log(size() + N)) ï¼å
¶ä¸ N æ¯è¦æå
¥çå
ç´ æ°ãO(log(size())) ã
注解
ææç¤ºæå ¥ (4-6) ä¸è¿å bool ï¼è¿æ¯ä¸ºäºä¸é¡ºåºå®¹å¨ä¸çå®ä½æå ¥ï¼å¦ std::vector::insert ç¾åå ¼å®¹ãè¿ä½¿å¾å¯ä»¥å建æ³åæå ¥å¨ï¼ä¾å¦ std::inserter ãæ£æ¥ææç¤ºæå ¥æ¯å¦æåçä¸ç§æ¹å¼æ¯æ¯è¾æå ¥ååç size() ã
示ä¾
#include <iomanip> #include <iostream> #include <map> #include <string>  using namespace std::literals;  template<typename It> void printInsertionStatus(It it, bool success) { std::cout << "Insertion of " << it->first << (success ? " succeeded\n" : " failed\n"); }  int main() { std::map<std::string, float> karasunoPlayerHeights;  // éè½½ 3 ï¼ä»å³å¼å¼ç¨æå ¥ const auto [it_hinata, success] = karasunoPlayerHeights.insert({"Hinata"s, 162.8}); printInsertionStatus(it_hinata, success);  { // éè½½ 1 ï¼ä»å·¦å¼å¼ç¨æå ¥ const auto [it, success2] = karasunoPlayerHeights.insert(*it_hinata); printInsertionStatus(it, success2); } { // éè½½ 2 ï¼ç»ç±è½¬åå° emplace æå ¥ const auto [it, success] = karasunoPlayerHeights.insert({"Kageyama", 180.6}); printInsertionStatus(it, success); }  { // éè½½ 6 ï¼å¸¦ä½ç½®æç¤ºä»å³å¼å¼ç¨æå ¥ const std::size_t n = std::size(karasunoPlayerHeights); const auto it = karasunoPlayerHeights.insert(it_hinata, {"Azumane"s, 184.7}); printInsertionStatus(it, std::size(karasunoPlayerHeights) != n); } { // éè½½ 4 ï¼å¸¦ä½ç½®æç¤ºä»å·¦å¼å¼ç¨æå ¥ const std::size_t n = std::size(karasunoPlayerHeights); const auto it = karasunoPlayerHeights.insert(it_hinata, *it_hinata); printInsertionStatus(it, std::size(karasunoPlayerHeights) != n); } { // éè½½ 5 ï¼å¸¦ä½ç½®æç¤ºç»ç±è½¬åå° emplace æå ¥ const std::size_t n = std::size(karasunoPlayerHeights); const auto it = karasunoPlayerHeights.insert(it_hinata, {"Tsukishima", 188.3}); printInsertionStatus(it, std::size(karasunoPlayerHeights) != n); }  auto node_hinata = karasunoPlayerHeights.extract(it_hinata); std::map<std::string, float> playerHeights;  // éè½½ 7 ï¼ä»èå´æå ¥ playerHeights.insert(std::begin(karasunoPlayerHeights), std::end(karasunoPlayerHeights));  // éè½½ 8 ï¼ä» initializer_list æå ¥ playerHeights.insert({{"Kozume"s, 169.2}, {"Kuroo", 187.7}});   // éè½½ 9 ï¼æå ¥ç»ç¹ const auto status = playerHeights.insert(std::move(node_hinata)); printInsertionStatus(status.position, status.inserted);  node_hinata = playerHeights.extract(status.position); { // éè½½ 10 ï¼æå ¥ç»ç¹å¸¦ä½ç½®æç¤º const std::size_t n = std::size(playerHeights); const auto it = playerHeights.insert(std::begin(playerHeights), std::move(node_hinata)); printInsertionStatus(it, std::size(playerHeights) != n); }   // æå°ç»æ map std::cout << std::left << '\n'; for (const auto& [name, height] : playerHeights) std::cout << std::setw(10) << name << " | " << height << "cm\n"; }
è¾åºï¼
Insertion of Hinata succeeded Insertion of Hinata failed Insertion of Kageyama succeeded Insertion of Azumane succeeded Insertion of Hinata failed Insertion of Tsukishima succeeded Insertion of Hinata succeeded Insertion of Hinata succeeded  Azumane | 184.7cm Hinata | 162.8cm Kageyama | 180.6cm Kozume | 169.2cm Kuroo | 187.7cm Tsukishima | 188.3cm
åé
| (C++11) |
å使é å
ç´ (å ¬å¼æå彿°) |
| (C++11) |
ä½¿ç¨æç¤ºå使é å
ç´ (å ¬å¼æå彿°) |
| (C++17) |
æå
¥å
ç´ ï¼æè¥å
³é®å·²åå¨åèµå¼ç»å½åå
ç´ (å ¬å¼æå彿°) |