C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- std::basic_string
- std::basic_string_view
- ç©ºç»æ¢åèå符串
- ç©ºç»æ¢å¤åèå符串
- ç©ºç»æ¢å®½å符串
- std::char_traits
- 注é
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >åç¬¦ä¸²åº > std::char_traits
std::char_traits
  class CharT
char_traits ç±»æ¯ä¸ç§ç¹æ§ç±»æ¨¡æ¿ï¼å¯¹ç»å®çåç¬¦ç±»åæ½è±¡åºç¡å符åå符串æ¯è¾æä½ãæå®ä¹æä½éæ¯å ä¹å§ç»å¯å®ç°äºå
¶é¡¹çéç¨ç®æ³ãä»èå¯ä»¥å°è¿äºç®æ³ç¨äºå ä¹ä»»ä½å¯è½çå符æå符串类åï¼åªéæä¾èªå®ä¹ç char_traits ç±»ã
char_traits 类模æ¿ç±äºæ¾å¼å®ä¾åï¼è¡¨ç°ä¸ºä¸ç§åºç¡ãç¨æ·å¯ä»¥å¯¹ä»»ä½èªå®ä¹å符类åæä¾ç¹åãæ åå符类åä¸å·²å®ä¹äºæ°ç§ç¹åã
æ åç¹å
æ åç¹åçæå typedef å®ä¹å¦ä¸ã
| ç¹å | char_type
|
int_type
|
pos_type
|
|---|---|---|---|
| std::char_traits<char> | char | int | std::streampos |
| std::char_traits<wchar_t> | wchar_t | std::wint_t | std::wstreampos |
| std::char_traits<char16_t> (C++11) | char16_t | std::uint_least16_t | std::u16streampos |
| std::char_traits<char32_t> (C++11) | char32_t | std::uint_least32_t | std::u32streampos |
| std::char_traits<char8_t> (C++20) | char8_t | unsigned char | std::u8streampos |
| æåç±»å | å®ä¹ï¼å¯¹æææ åç¹åç¸åï¼ |
|---|---|
off_type
|
std::streamoff |
state_type
|
std::mbstate_t |
comparison_category (C++20)
|
std::strong_ordering |
æ åç¹åçæå彿°çè¯ä¹å®ä¹å¦ä¸ï¼
| ç¹å | assign
|
eq
|
lt
|
eof
|
|---|---|---|---|---|
| std::char_traits<char> | = | unsigned char ç ==
|
unsigned char ç <
|
EOF |
| std::char_traits<wchar_t> | = | == | < | WEOF |
| std::char_traits<char16_t> (C++11) | = | == | < | éæ³ UTF-16 ç¼ç åå |
| std::char_traits<char32_t> (C++11) | = | == | < | éæ³ UTF-32 ç¼ç åå |
| std::char_traits<char8_t> (C++20) | = | == | < | éæ³ UTF-8 ç¼ç åå |
char_traits 类模æ¿çæ åç¹å满足å符ç¹å¾ (CharTraits) çè¦æ±ã
æåç±»å
| Â | |
| ç±»å | å®ä¹ |
char_type
|
CharT
|
int_type
|
è½ä¿æææ char_type å¼å EOF çæ´æ°ç±»å
|
off_type
|
å®ç°å®ä¹ |
pos_type
|
å®ç°å®ä¹ |
state_type
|
å®ç°å®ä¹ |
æå彿°
| [éæ] |
èµå¼ä¸ä¸ªå符 (å ¬å¼éææå彿°) |
| [éæ] |
æ¯è¾äºä¸ªå符 (å ¬å¼éææå彿°) |
| [éæ] |
ç§»å¨ä¸ä¸ªå符åºåå°å¦ä¸ä¸ªä¸ (å ¬å¼éææå彿°) |
| [éæ] |
å¤å¶ä¸ä¸ªå符åºå (å ¬å¼éææå彿°) |
| [éæ] |
以åå
¸åºæ¯è¾äºä¸ªå符åºå (å ¬å¼éææå彿°) |
| [éæ] |
è¿åä¸ä¸ªå符åºåçé¿åº¦ (å ¬å¼éææå彿°) |
| [éæ] |
å¨å符åºå䏿¥æ¾ä¸ä¸ªå符 (å ¬å¼éææå彿°) |
| [éæ] |
è½¬æ¢ int_type å°çæç char_type (å ¬å¼éææå彿°) |
| [éæ] |
è½¬æ¢ char_type å°çæç int_type (å ¬å¼éææå彿°) |
| [éæ] |
æ¯è¾äºä¸ª int_type å¼ (å ¬å¼éææå彿°) |
| [éæ] |
è¿åä¸ä¸ª eof å¼ (å ¬å¼éææå彿°) |
| [éæ] |
æ£æ¥å符æ¯å¦ä¸º eof å¼ (å ¬å¼éææå彿°) |
示ä¾
ç¨æ·å®ä¹çåç¬¦ç¹æ§å¯ä»¥ç¨äºæä¾æ å ³å¤§å°åçæ¯è¾
#include <string> #include <iostream> #include <cctype> Â struct ci_char_traits : public std::char_traits<char> { static char to_upper(char ch) { return std::toupper((unsigned char) ch); } static bool eq(char c1, char c2) { return to_upper(c1) == to_upper(c2); } static bool lt(char c1, char c2) { return to_upper(c1) < to_upper(c2); } static int compare(const char* s1, const char* s2, size_t n) { while ( n-- != 0 ) { if ( to_upper(*s1) < to_upper(*s2) ) return -1; if ( to_upper(*s1) > to_upper(*s2) ) return 1; ++s1; ++s2; } return 0; } static const char* find(const char* s, int n, char a) { auto const ua (to_upper(a)); while ( n-- != 0 ) { if (to_upper(*s) == ua) return s; s++; } return nullptr; } }; Â using ci_string = std::basic_string<char, ci_char_traits>; Â std::ostream& operator<<(std::ostream& os, const ci_string& str) { return os.write(str.data(), str.size()); } Â int main() { ci_string s1 = "Hello"; ci_string s2 = "heLLo"; if (s1 == s2) std::cout << s1 << " and " << s2 << " are equal\n"; }
è¾åºï¼
Hello and heLLo are equal
åé
| åå¨å¹¶æä½å符åºå (类模æ¿) |