C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- C++ å ·åè¦æ±ï¼ 彿°å¯¹è±¡ (FunctionObject)
- C++ å ·åè¦æ±ï¼ äºå è°è¯ (BinaryPredicate)
- C++ å ·åè¦æ±ï¼ å¯é»è®¤æé (DefaultConstructible)
- C++ å ·åè¦æ±ï¼ å¯å¤å¶èµå¼ (CopyAssignable)
- C++ å ·åè¦æ±ï¼ å¯å¤å¶æé (CopyConstructible)
- C++ å ·åè¦æ±ï¼ å¯ç§»å¨èµå¼ (MoveAssignable) (C++11 èµ·)
- C++ å ·åè¦æ±ï¼ å¯ç§»å¨æé (MoveConstructible) (C++11 èµ·)
- C++ å ·åè¦æ±ï¼ 坿æ (Destructible)
- C++ å ·åè¦æ±ï¼ å¯å¹³å¡å¤å¶ (TriviallyCopyable)
- C++ å ·åè¦æ±ï¼ å¯ç¸çæ¯è¾ (EqualityComparable)
- C++ å ·åè¦æ±ï¼ å¯å°äºæ¯è¾ (LessThanComparable)
- C++ å ·åè¦æ±ï¼ æ¯è¾ (Compare)
- C++ å ·åè¦æ±ï¼ åé¢ç±»å (LiteralType)
- C++ å ·åè¦æ±ï¼ ç®æ§æ°æ®ç±»å (PODType)
- C++ å ·åè¦æ±ï¼ å¹³å¡ç±»å (TrivialType)
- C++ å ·åè¦æ±ï¼ æ åå¸å±ç±»å (StandardLayoutType)
- C++ å ·åè¦æ±ï¼ éçååè¿ä»£å¨ (LegacyForwardIterator)
- C++ å ·åè¦æ±ï¼ å¯äº¤æ¢ (Swappable)
- C++ å ·åè¦æ±ï¼ å¼å¯äº¤æ¢ (ValueSwappable)
- C++ å ·åè¦æ±ï¼ å¯ç©ºæé (NullablePointer) (C++11 èµ·)
- C++ å ·åè¦æ±ï¼ æ£å (Hash)
- C++ å ·åè¦æ±ï¼ åé å¨ (Allocator)
- C++ å ·åè¦æ±ï¼ å¯è°ç¨ (Callable)
- C++ å ·åè¦æ±ï¼ è°è¯ (Predicate)
- C++ å ·åè¦æ±ï¼ å®¹å¨ (Container)
- C++ å ·åè¦æ±ï¼ åºåå®¹å¨ (SequenceContainer)
- C++ å ·åè¦æ±ï¼ è¿ç»å®¹å¨ (ContiguousContainer)
- C++ å ·åè¦æ±ï¼ å¯éå®¹å¨ (ReversibleContainer)
- C++ å ·åè¦æ±ï¼ å ³èå®¹å¨ (AssociativeContainer)
- C++ å ·åè¦æ±ï¼ å ·åé å¨å®¹å¨ (AllocatorAwareContainer)
- C++ å ·åè¦æ±ï¼ æ åºå ³èå®¹å¨ (UnorderedAssociativeContainer)
- C++ å ·åè¦æ±ï¼ å¯é»è®¤æå ¥ (DefaultInsertable)
- C++ å ·åè¦æ±ï¼ å¯å¤å¶æå ¥ (CopyInsertable)
- C++ å ·åè¦æ±ï¼ å¯ç§»å¨æå ¥ (MoveInsertable) (C++11 èµ·)
- C++ å ·åè¦æ±ï¼ å¯å°±ä½æé (EmplaceConstructible) (C++11 èµ·)
- C++ å ·åè¦æ±ï¼ 坿¦é¤ (Erasable)
- C++ å ·åè¦æ±ï¼ éçè¿ä»£å¨ (LegacyIterator)
- C++ å ·åè¦æ±ï¼ éçè¾åºè¿ä»£å¨ (LegacyOutputIterator)
- C++ å ·åè¦æ±ï¼ éçè¾å ¥è¿ä»£å¨ (LegacyInputIterator)
- C++ å ·åè¦æ±ï¼ éçååè¿ä»£å¨ (LegacyBidirectionalIterator)
- C++ å ·åè¦æ±ï¼ éçéæºè®¿é®è¿ä»£å¨ (LegacyRandomAccessIterator)
- C++ å ·åè¦æ±ï¼ éçè¿ç»è¿ä»£å¨ (LegacyContiguousIterator)
- C++ å ·åè¦æ±ï¼ 常é表达å¼è¿ä»£å¨ (ConstexprIterator)
- C++ å ·åè¦æ±ï¼ ææ ¼å¼è¾å ¥å½æ° (FormattedInputFunction)
- C++ å ·åè¦æ±ï¼ æ æ ¼å¼è¾å ¥å½æ° (UnformattedInputFunction)
- C++ å ·åè¦æ±ï¼ ææ ¼å¼è¾åºå½æ° (FormattedOutputFunction)
- C++ å ·åè¦æ±ï¼ æ æ ¼å¼è¾åºå½æ° (UnformattedOutputFunction)
- C++ å ·åè¦æ±ï¼ ç§ååºå (SeedSequence)
- C++ å ·åè¦æ±ï¼ éæºæ°å¼æ (RandomNumberEngine)
- C++ å ·åè¦æ±ï¼ éæºæ°åå¸ (RandomNumberDistribution)
- C++ å ·åè¦æ±ï¼ ååéæºä½çæå¨ (UniformRandomBitGenerator)
- C++ å ·åè¦æ±ï¼ éæºæ°å¼æéé å¨ (RandomNumberEngineAdaptor)
- C++ å ·åè¦æ±ï¼ åºæ¬å¯éå® (BasicLockable)
- C++ å ·åè¦æ±ï¼ å¯éå® (Lockable)
- C++ å ·åè¦æ±ï¼ å¯å®æ¶éå® (TimedLockable)
- C++ å ·åè¦æ±ï¼ äºæ¥ä½ (Mutex)
- C++ å ·åè¦æ±ï¼ 宿¶äºæ¥ä½ (TimedMutex)
- C++ å ·åè¦æ±ï¼ å ±äº«äºæ¥ä½ (SharedMutex)
- C++ å ·åè¦æ±ï¼ å ±äº«å®æ¶äºæ¥ä½ (SharedTimedMutex)
- C++ å ·åè¦æ±ï¼ å符ç¹å¾ (CharTraits)
- C++ å ·åè¦æ±ï¼ æ£å表达å¼ç¹å¾ (RegexTraits)
- C++ å ·åè¦æ±ï¼ 使©ç ç±»å (BitmaskType)
- C++ å ·åè¦æ±ï¼ æ°å¼ç±»å (NumericType)
- C++ å ·åè¦æ±ï¼ ä¸å ç±»åç¹å¾ (UnaryTypeTrait)
- C++ å ·åè¦æ±ï¼ äºå ç±»åç¹å¾ (BinaryTypeTrait)
- C++ å ·åè¦æ±ï¼ 忢ç¹å¾ (TransformationTrait)
- C++ å ·åè¦æ±ï¼ æ¶é (Clock)
- C++ å ·åè¦æ±ï¼ 平塿¶é (TrivialClock)
- 注é
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >å ·åè¦æ± > C++ å ·åè¦æ±ï¼ åé å¨ (Allocator)
C++ å ·åè¦æ±ï¼ åé å¨ (Allocator)
å°è£ 访é®/寻åï¼åé /è§£åé ï¼ä»¥å对象çæé /ææççç¥ã
å¯è½éè¦åé
æéæ¾å
åçæ¯ä¸ªæ ååºç»ä»¶ï¼ä» std::stringãstd::vector å std::array 以å¤çææå®¹å¨ï¼å° std::shared_ptr å std::functionï¼é½éè¿åé
å¨ (Allocator) è¿è¡è¿äºæä½ï¼åé
卿¯æ»¡è¶³ä¸åè¦æ±ç类类å对象ã
æäºè¦æ±æ¯å¯éçï¼æ¨¡æ¿ std::allocator_traits 为ææå¯éè¦æ±æä¾é»è®¤å®ç°ï¼ä¸æææ ååºå®¹å¨åå
¶ä»å
·åé
å¨ç±»ï¼é½æ¯éè¿ std::allocator_traits 访é®åé
å¨ï¼èå¹¶ä¸ç´æ¥è®¿é®ã
è¦æ±
ç»å®
- æ cv éå®ç对象类å
T - é对类å
Tçåé å¨ (Allocator) ç±»åA -
Aç±»åç对象a -
Bï¼ä¸ºé对æä¸ªæ cv éå®ç对象类åUç对åºåé å¨ (Allocator) ç±»åï¼éç»å®Aæå¾ï¼ -
Bç±»åç对象b -
allocator_traits<A>::pointerç±»åçå¼ptrï¼ç±è°ç¨ allocator_traits<A>::allocate() æè·å¾ -
allocator_traits<A>::const_pointerç±»åçå¼cptrï¼ä»ptr转æ¢èè·å¾ -
allocator_traits<A>::void_pointerç±»åçå¼vptrï¼ä»ptr转æ¢èè·å¾ -
allocator_traits<A>::const_void_pointerç±»åçå¼cvptrï¼ä»cptrævptr转æ¢èè·å¾ -
xptrï¼ä¸ºé对æåæ cv éå®å¯¹è±¡ç±»åXçå¯è§£å¼ç¨æé -
rï¼ä¸ºä»è¡¨è¾¾å¼ *ptr è·å¾çTç±»åçå·¦å¼ -
allocator_traits<A>::size_typeç±»åçå¼n
| è¡¨è¾¾å¼ | è¦æ± | è¿åç±»å |
|---|---|---|
| A::pointer (å¯é) | 满足å¯ç©ºæé (NullablePointer) ãéçéæºè®¿é®è¿ä»£å¨ (LegacyRandomAccessIterator) åéçè¿ç»è¿ä»£å¨ (LegacyContiguousIterator) ï¼è§ä¸æç¼é¥°æéï¼ | |
| A::const_pointer (å¯é) | A::pointer å¯è½¬æ¢ä¸º A::const_pointerãå¯ç©ºæé (NullablePointer) ãéçéæºè®¿é®è¿ä»£å¨ (LegacyRandomAccessIterator) åéçè¿ç»è¿ä»£å¨ (LegacyContiguousIterator)
|
|
| A::void_pointer (å¯é) | A::pointer å¯è½¬æ¢ä¸º A::void_pointer
|
|
| A::const_void_pointer (å¯é) | A::pointerãA::const_pointer å A::void_pointer å¯è½¬æ¢å° A::const_void_pointer
|
|
| A::value_type | ç±»å T
| |
| A::size_type (å¯é) | A::size_type è½è¡¨ç¤º A æè½åé
çæå¤§å¯¹è±¡ç大å°
|
æ ç¬¦å·æ´æ°ç±»å |
| A::difference_type (å¯é) | A::difference_type è½è¡¨ç¤ºä»»æä¸¤ä¸ªæå A æåé
对象çæéä¹é´çå·®
|
æç¬¦å·æ´æ°ç±»å |
| A::template rebind<U>::other (å¯é)[1] | 对äºä»»ä½ Uï¼B::template rebind<T>::other 为 A
|
ç±»å B
|
| *ptr | T&
| |
| *cptr | *cptr ä¸ *ptr æ è¯åä¸å¯¹è±¡ | const T&
|
| ptr->m | è¥ (*ptr).m è¯æï¼åä¸ (*ptr).m ç¸å | T::m çç±»å
|
| cptr->m | è¥ (*cptr).m è¯æï¼åä¸ (*cptr).m ç¸å | T::m çç±»å
|
| static_cast<A::pointer>(vptr) | static_cast<A::pointer>(vptr) == ptr | A::pointer
|
| static_cast<A::const_pointer>(cvptr) | static_cast<A::const_pointer>(cvptr) == cptr | A::const_pointer
|
| std::pointer_traits<A::pointer>::pointer_to(r) | A::pointer
| |
| a.allocate(n) | åé
éå n 个 T ç±»å对象çåå¨ï¼ä½ä¸æé å®ä»¬ãå¯ä»¥æå¼å¸¸ã
|
A::pointer
|
| a.allocate(n, cvptr) (å¯é) | ä¸ a.allocate(n) ç¸åï¼ä½å¯ä»¥ä»¥æªææçæ¹å¼ä½¿ç¨ cvptrï¼ä» a.allocate() è·å¾çæéæ nullptr_tï¼ä»¥åå©å±é¨æ§
|
A::pointer
|
| a.deallocate(ptr, n) | è§£åé
ptr ææåçåå¨ï¼è¯¥æéå¿
é¡»æ¯å
åä»å¯¹ allocate çè°ç¨è·å¾çæéï¼ä¸æªå ä¸é´å¯¹ deallocate çè°ç¨è失æãn å¿
é¡»å¹é
å
åä¼ éç» allocate çå¼ã䏿å¼å¸¸ã
|
ï¼ä¸ä½¿ç¨ï¼ |
| a.max_size() (å¯é) | è½ä¼ éç» A::allocate() çæå¤§å¼
|
A::size_type
|
| a1 == a2 | ä»
è¥åé
å¨ a1 åé
çåå¨è½éè¿ a2 è§£åé
æè¿å trueã建ç«èªåã对称åå¯ä¼ éå
³ç³»ã䏿å¼å¸¸ã
|
bool |
| a1 != a2 | ä¸ !(a1==a2) ç¸å | bool |
| A a1(a)
A a1 = a |
å¤å¶æé a1 以满足 a1 == aã䏿å¼å¸¸ãï¼æ³¨æï¼ææåé
å¨ (Allocator) ä¹é½æ»¡è¶³å¯å¤å¶æé (CopyConstructible) ï¼
|
|
| A a(b) | æé 满足 B(a)==b å A(b)==a ç aã䏿å¼å¸¸ãï¼æ³¨æï¼è¿æå³çææå rebind ç¸å
³èçåé
å¨é½å½¼æ¤ç»´æ¤èµæºï¼ä¾å¦å
åæ± ï¼
|
|
| A a1(std::move(a))
A a1 = std::move(a) |
æé a1 使ä¹çäº a ä¹åçå¼ã䏿å¼å¸¸ã a çå¼ä¸åä¸ a1 == aã (C++17 èµ·)
|
|
| A a(std::move(b)) | æé a 使ä¹çäº A(b) ä¹åçå¼ã䏿å¼å¸¸ã
|
|
| a.construct(xptr, args) (å¯é) | å¨å
ååé
çåå¨ä¸ç± xptr ææåçå°åä¸ï¼ä»¥ args 为æé 彿°å®åæé ä¸ä¸ª X ç±»åç对象
|
|
| a.destroy(xptr) (å¯é) | ææ xptr ææåç X ç±»åç对象ï¼ä½ä¸è§£åé
ä»»ä½åå¨ã
|
|
| a.select_on_container_copy_construction() (å¯é) | æä¾ä¸ä¸ª A å®ä¾ï¼ä»¥è¢«ä»å½åæ£ä½¿ç¨ a ç容卿å¤å¶æé ç容å¨ä½¿ç¨ãé常è¦ä¹è¿å a ç坿¬ï¼è¦ä¹ä¸ºé»è®¤æé ç A()ã
|
A
|
| A::propagate_on_container_copy_assignment (å¯é) | è¥å¨ä½¿ç¨ A ç±»åçåé
å¨ç容å¨è¢«å¤å¶èµå¼æ¶éè¦å¤å¶è¯¥åé
å¨ï¼å为 trueãæ³¨æï¼è¥æºåç®æ 容å¨çåé
卿¯è¾ä¸ç¸çï¼åå¤å¶èµå¼æ¶å¿
é¡»ç¨æ§åé
å¨è§£åé
ç®æ çå
åï¼åå¨è¿è¡åå
ç´ ï¼ååé
å¨ï¼çå¤å¶ä¹åç¨æ°åé
å¨åé
å
å
|
std::true_type æ std::false_type æä»å®æ´¾ççç±»å |
| A::propagate_on_container_move_assignment (å¯é) | è¥å¨ä½¿ç¨ A ç±»åçåé
å¨ç容å¨è¢«ç§»å¨èµå¼æ¶éè¦ç§»å¨è¯¥åé
å¨ï¼å为 trueãè¥æ¤æåæ¯ false 䏿ºåç®æ 容å¨çåé
卿¯è¾ä¸ç¸çï¼åç§»å¨èµå¼ä¸è½å¤ºåæºå
åçæææï¼èå¿
é¡»é个è¿è¡å
ç´ çç§»å¨èµå¼æç§»å¨æé ï¼æéè°æ´å
¶èªèº«å
åç大å°ã
|
std::true_type æ std::false_type æä»å®æ´¾ççç±»å |
| A::propagate_on_container_swap (å¯é) | è¥å¨ä½¿ç¨ A ç±»åçåé
å¨ç两个容å¨è¿è¡äº¤æ¢æ¶éè¦äº¤æ¢åé
å¨ï¼å为 trueãè¥æ¤æåæ¯ false ä¸ä¸¤ä¸ªå®¹å¨çåé
卿¯è¾ä¸ç¸çï¼å容å¨äº¤æ¢çè¡ä¸ºæªå®ä¹ã
|
std::true_type æ std::false_type æä»å®æ´¾ççç±»å |
| A::is_always_equal (C++17 èµ·) (å¯é) | è¥ä¸¤ä¸ª A ç±»åçåé
å¨å§ç»æ¯è¾ç¸çå为 trueãè¥ä¸æä¾ï¼å std::allocator_traits é»è®¤å®çäº std::is_empty<A>::type
|
std::true_type æ std::false_type æä»å®æ´¾ççç±»å |
注ï¼
- â ä»
彿¤åé
卿¯ SomeAllocator<T, Args> å½¢å¼ç模æ¿ï¼å
¶ä¸
Argsæ¯é¶ææ´å¤é¢å¤ç模æ¿ç±»åå½¢åï¼æ¶ï¼rebind ææ¯å¯éçï¼ç± std::allocator_traits æä¾ï¼ã
|
å¦å¤ï¼ä¸ºä½¿ç±»å
|
(C++17 èµ·) |
|
ç»å®
åï¼å½ä¸ä»
å½ ç»å®
å对äºè¡¨è¾¾å¼ w1 == w2 ä¸ w1 != w2ï¼ä»»ä¸æä¸¤ä¸ªå¯¹è±¡é½å¯ç±å¼çä»·ç ç»å®
åï¼å¯¹äºè¡¨è¾¾å¼ p1 == p2ãp1 != p2ãp1 < p2ãp1 <= p2ãp1 >= p2ãp1 > p2ãp1 - p2}ï¼ä»»ä¸æä¸¤ä¸ªå¯¹è±¡é½å¯ç±å¼çä»·ç ä¸è¿°è¦æ±ä½¿å¾æ¯è¾å®¹å¨ (Container) ç iterator å const_iterator æä¸ºå¯è½ã |
(C++14 èµ·) |
åé å¨å®æ´æ§è¦æ±è¥æ 论
|
(C++17 èµ·) |
ç¼é¥°æé
彿åç±»å pointer 䏿¯åçæéæ¶ï¼å®é常被称为âç¼é¥°æéï¼fancy pointerï¼âãè¿ç§æéæ¾ä¸ºæ¯æå段å
åæ¶æèå¼å
¥ï¼å¹¶å¨å½ä»ç¨äºè®¿é®å¨æäºä¸åäºåçæéæè®¿é®çåè´¨èæå°å空é´çå°å空é´ä¸æåé
ç对象ãç¼é¥°æéçä¸ä¸ªå®ä¾æ¯æ å°çä¸ä¾èµå°åæé boost::interprocess::offset_ptrï¼å®ä½¿å¾å¨å
±äº«å
åå卿¯ä¸ªè¿ç¨ä¸æ å°å°ä¸åå°åçæ å°å°å
åæä»¶ä¸ï¼åé
std::set ä¸ç±»çåºäºç»ç¹çæ°æ®ç»æå¯è¡ãéè¿ç±»æ¨¡æ¿ std::pointer_traits ï¼ (C++11 èµ·)ç¼é¥°æéå¯ä»¥ç¬ç«äºæä¾å®ä»¬çåé
å¨è使ç¨ãè½ç¨å½æ° std::to_address ä»ç¼é¥°æéè·å¾è£¸æéã (C++20 èµ·)
æ ååº
ä¸åæ ååºç»ä»¶æ»¡è¶³åé å¨ (Allocator) è¦æ±ï¼
| é»è®¤çåé
å¨ (类模æ¿) | |
| (C++11) |
为å¤çº§å®¹å¨å®ç°çå¤çº§åé
å¨ (类模æ¿) |
| (C++17) |
以 std::memory_resource æé ï¼æ¯æåºäºå®çè¿è¡æ¶å¤æçåé
å¨ (类模æ¿) |
示ä¾
ä¸ä¸ª C++11 åé å¨ï¼ä½æ·»å äº [[nodiscard]] 以符å C++20 飿 ¼ã
#include <cstdlib> #include <new> #include <limits> Â template <class T> struct Mallocator { typedef T value_type; Â Mallocator () = default; template <class U> constexpr Mallocator (const Mallocator <U>&) noexcept {} Â [[nodiscard]] T* allocate(std::size_t n) { if (n > std::numeric_limits<std::size_t>::max() / sizeof(T)) throw std::bad_alloc(); Â if (auto p = static_cast<T*>(std::malloc(n*sizeof(T)))) return p; Â throw std::bad_alloc(); } void deallocate(T* p, std::size_t) noexcept { std::free(p); } }; Â template <class T, class U> bool operator==(const Mallocator <T>&, const Mallocator <U>&) { return true; } template <class T, class U> bool operator!=(const Mallocator <T>&, const Mallocator <U>&) { return false; }