C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- std::basic_string
- std::basic_string<CharT,Traits,Allocator>::npos
- std::basic_string<CharT,Traits,Allocator>::at
- std::hash (std::string, std::wstring, std::u16string, std::u32string, std::pmr::string, std::pmr::wstring, std::pmr::u16string, std::pmr::u32string)
- std::basic_string<CharT,Traits,Allocator>::assign
- std::basic_string<CharT,Traits,Allocator>::get_allocator
- std::basic_string<CharT,Traits,Allocator>::substr
- std::basic_string<CharT,Traits,Allocator>::basic_string
- std::basic_string<CharT,Traits,Allocator>::operator=
- std::basic_string<CharT,Traits,Allocator>::operator[]
- std::basic_string<CharT,Traits,Allocator>::front
- std::basic_string<CharT,Traits,Allocator>::back
- std::basic_string<CharT,Traits,Allocator>::data
- std::basic_string<CharT,Traits,Allocator>::c_str
- std::basic_string<CharT,Traits,Allocator>::operator basic_string_view
- std::basic_string<CharT,Traits,Allocator>::begin, std::basic_string<CharT,Traits,Allocator>::cbegin
- std::basic_string<CharT,Traits,Allocator>::end, std::basic_string<CharT,Traits,Allocator>::cend
- std::basic_string<CharT,Traits,Allocator>::rbegin, std::basic_string<CharT,Traits,Allocator>::crbegin
- std::basic_string<CharT,Traits,Allocator>::rend, std::basic_string<CharT,Traits,Allocator>::crend
- std::basic_string<CharT,Traits,Allocator>::empty
- std::basic_string<CharT,Traits,Allocator>::size, std::basic_string<CharT,Traits,Allocator>::length
- std::basic_string<CharT,Traits,Allocator>::max_size
- std::basic_string<CharT,Traits,Allocator>::reserve
- std::basic_string<CharT,Traits,Allocator>::capacity
- std::basic_string<CharT,Traits,Allocator>::shrink_to_fit
- std::basic_string<CharT,Traits,Allocator>::clear
- std::basic_string<CharT,Traits,Allocator>::insert
- std::basic_string<CharT,Traits,Allocator>::erase
- std::basic_string<CharT,Traits,Allocator>::push_back
- std::basic_string<CharT,Traits,Allocator>::pop_back
- std::basic_string<CharT,Traits,Allocator>::append
- std::basic_string<CharT,Traits,Allocator>::operator+=
- std::basic_string<CharT,Traits,Allocator>::compare
- std::basic_string<CharT,Traits,Allocator>::starts_with
- std::basic_string<CharT,Traits,Allocator>::ends_with
- std::basic_string<CharT,Traits,Allocator>::replace
- std::basic_string<CharT,Traits,Allocator>::copy
- std::basic_string<CharT,Traits,Allocator>::resize
- std::basic_string<CharT,Traits,Allocator>::swap
- std::basic_string<CharT,Traits,Allocator>::find
- std::basic_string<CharT,Traits,Allocator>::rfind
- std::basic_string<CharT,Traits,Allocator>::find_first_of
- std::basic_string<CharT,Traits,Allocator>::find_first_not_of
- std::basic_string<CharT,Traits,Allocator>::find_last_of
- std::basic_string<CharT,Traits,Allocator>::find_last_not_of
- std::operator+(std::basic_string)
- std::swap(std::basic_string)
- std::literals::string_literals::operator""s
- std::erase, std::erase_if (std::basic_string)
- operator<<,>>(std::basic_string)
- std::getline
- operator==,!=,<,<=,>,>=,<=>(std::basic_string)
- std::stoi, std::stol, std::stoll
- std::stoul, std::stoull
- std::stof, std::stod, std::stold
- std::to_string
- std::to_wstring
- std::basic_string çæ¨å¯¼æå¼
- std::basic_string_view
- ç©ºç»æ¢åèå符串
- ç©ºç»æ¢å¤åèå符串
- ç©ºç»æ¢å®½å符串
- std::char_traits
- 注é
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >åç¬¦ä¸²åº >std::basic_string > std::basic_string<CharT,Traits,Allocator>::compare
std::basic_string<CharT,Traits,Allocator>::compare
       const basic_string& str,
       const basic_string& str,
(C++20 å)
            const basic_string& str,
       const CharT* s ) const;
            const CharT* s ) const;
       const CharT* s, size_type count2 ) const;
            const CharT* s, size_type count2 ) const;
int compare( const T& t ) const noexcept(/* see below */);
(C++20 å)
constexpr int compare( const T& t ) const noexcept(/* see below */);
int compare( size_type pos1, size_type count1,
(C++20 å)
constexpr int compare( size_type pos1, size_type count1,
int compare( size_type pos1, size_type count1,
       const T& t,
(C++20 å)
constexpr int compare( size_type pos1, size_type count1,
            const T& t,
æ¯è¾äºä¸ªå符åºåã
[pos1, pos1+count1) åä¸²ä¸ str ãè¥ count1 > size() - pos1 åå串为 [pos1, size()) ã[pos1, pos1+count1) åä¸²ä¸ str çå串 [pos2, pos2+count2) ãè¥ count1 > size() - pos1 å第ä¸å串为 [pos1, size()) ã类似å°è¥ count2 > str.size() - pos2 å第äºå串为 [pos2, str.size()) ãTraits::length(s) çç©ºç»æ¢å符åºåã[pos1, pos1+count1) å串ä¸å§äº s ææåå符çé¿åº¦ä¸º Traits::length(s) çç©ºç»æ¢å符åºåãè¥ count1 > size() - pos1 åå串为 [pos1, size()) ã[pos1, pos1+count1) å串ä¸èå´ [s, s + count2) ä¸çå符ãï¼æ³¨æï¼èå´ [s, s + count2) ä¸çå符å¯å
å«ç©ºå符ãï¼t 为 string_view sv ï¼ç¶åæ¯è¾æ¤ string ä¸ sv ãæ¤éè½½ä»
è¥ std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> 为 true ä¸ std::is_convertible_v<const T&, const CharT*> 为 false æåä¸éè½½å³è®®ãt 为 string_view sv ï¼ç¶åæ¯è¾æ¤ string ç [pos1, pos1+count1) åä¸²ä¸ sv ï¼å¦åç¨ std::basic_string_view<CharT, Traits>(data(), size()).substr(pos1, count1).compare(sv) ãæ¤éè½½ä»
è¥ std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> 为 true ä¸ std::is_convertible_v<const T&, const CharT*> 为 false æåä¸éè½½å³è®®ãt 为 string_view sv ï¼ç¶åæ¯è¾æ¤ string ç [pos1, pos1+count1) åä¸²ä¸ sv ç [pos2, pos2+count2) å串ï¼å¦åç¨ std::basic_string_view<CharT, Traits>(data(), size()).substr(pos1, count1).compare(sv.substr(pos2, count2)); ãæ¤éè½½ä»
è¥ std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> 为 true ä¸ std::is_convertible_v<const T&, const CharT*> 为 false æåä¸éè½½å³è®®ãæä¸åæ¹å¼æ¯è¾å§äº data1 ç count1 个åç¬¦ç»æçå符åºåä¸å§äº data2 ç count2 个åç¬¦ç»æçå符åºåãé¦å
ï¼å¦åç¨ size_type rlen = std::min(count1, count2) 计ç®è¦æ¯è¾çå符æ°ãç¶åè°ç¨ Traits::compare(data1, data2, rlen) æ¯è¾åºåãå¯¹äºæ ååç¬¦ç¹æ§ï¼æ¤å½æ°è¿è¡éå符åå
¸åºæ¯è¾ãè¥ç»æä¸ºé¶ï¼å°æ¤ä¸ºæ¢çå符åºåç¸çï¼ï¼åæä¸åæ¹å¼æ¯è¾å
¶å¤§å°ï¼
| æ¡ä»¶ | ç»æ | è¿åå¼ | |
|---|---|---|---|
Traits::compare(data1, data2, rlen) < 0
|
data1 å°äº data2 | <0 | |
Traits::compare(data1, data2, rlen) == 0
|
size1 < size2 | data1 å°äº data2 | <0 |
| size1 == size2 | data1 çäº data2 | â0â | |
| size1 > size2 | data1 å¤§äº data2 | >0 | |
Traits::compare(data1, data2, rlen) > 0
|
data1 å¤§äº data2 | >0 | |
åæ°
| str | - | è¦æ¯è¾çå¦ä¸ string |
| s | - | æåè¦æ¯è¾çå符串çæé |
| count1 | - | æ¤ string è¦æ¯è¾çåç¬¦æ° |
| pos1 | - | æ¤ string ä¸è¦æ¯è¾çé¦å符çä½ç½® |
| count2 | - | ç»å®åç¬¦ä¸²è¦æ¯è¾çåç¬¦æ° |
| pos2 | - | ç»å®å符串çè¦æ¯è¾çé¦å符ä½ç½® |
| t | - | è¦æ¯è¾ç对象ï¼å¯è½¬æ¢ä¸º std::basic_string_view ï¼ |
è¿åå¼
è¥ *this å¨åå ¸åºä¸å åºç°äºåæ°ææå®çå符åºåï¼å为æ£å¼ã
è¥ä¸¤ä¸ªåºåæ¯è¾çä»·å为é¶ã
è¥ *this å¨åå ¸åºä¸ååºç°äºåæ°ææå®çå符åºåï¼å为è´å¼ã
å¼å¸¸
æ¥æ¶å为 pos1 æ pos2 çåæ°çéè½½è¥åæ°å¨èå´å¤åæåº std::out_of_range ã
basic_string_view çè½¬æ¢ææçå¼å¸¸ãå¯è½çå®ç°
template<class CharT, class Traits, class Alloc> int basic_string<CharT, Traits, Alloc>::compare(const std::basic_string& s) const noexcept { size_type lhs_sz = size(); size_type rhs_sz = s.size(); if (int result = traits_type::compare(data(), s.data(), std::min(lhs_sz, rhs_sz))) return result; if (lhs_sz < rhs_sz) return -1; if (lhs_sz > rhs_sz) return 1; return 0; } |
注æ
对äºä¸è¦æ±ä¸è·¯æ¯è¾çæ
å½¢ï¼ std::basic_string æä¾é常å
³ç³»è¿ç®ç¬¦ï¼ < ã <= ã == ã > çï¼ã
æ¤å½æ°é»è®¤ï¼ä»¥é»è®¤ std::char_traits ï¼ä¸ä¼èèæ¬å°ç¯å¢ãå ·æ¬å°ç¯å¢çä¸è·¯æ¯è¾è§ std::collate::compare ã
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| LWG 2946 | C++17 | string_view éè½½å¨æäºæ
åµä¸å¯¼è´æ§ä¹
|
éè¿ä½¿ä¹ä¸ºæ¨¡æ¿æ¥é¿å |
示ä¾
#include <cassert> #include <string> #include <iostream>  int main() { // 1) ä¸å¦ä¸ string æ¯è¾ { int compare_value{ std::string{"Batman"}.compare(std::string{"Superman"}) }; std::cout << ( compare_value < 0 ? "Batman comes before Superman\n" : compare_value > 0 ? "Superman comes before Batman\n" : "Superman and Batman are the same.\n" ); }  // 2) ä¸å¦ä¸ string æ¯è¾å串 { int compare_value{ std::string{"Batman"}.compare(3, 3, std::string{"Superman"}) }; std::cout << ( compare_value < 0 ? "man comes before Superman\n" : compare_value > 0 ? "Superman comes before man\n" : "man and Superman are the same.\n" ); }  // 3) ä¸å¦ä¸å串æ¯è¾å串 { std::string a{"Batman"}; std::string b{"Superman"};  int compare_value{a.compare(3, 3, b, 5, 3)};  std::cout << ( compare_value < 0 ? "man comes before man\n" : compare_value > 0 ? "man comes before man\n" : "man and man are the same.\n" ); // ä¸å¦ä¸å串æ¯è¾å串 // é»è®¤å°ä¸ºå¦ä¸ string çæ«å°¾ assert(compare_value == a.compare(3, 3, b, 5)); }  // 4) ä¸å¦ä¸ char æéæ¯è¾ { int compare_value{std::string{"Batman"}.compare("Superman")};  std::cout << ( compare_value < 0 ? "Batman comes before Superman\n" : compare_value > 0 ? "Superman comes before Batman\n" : "Superman and Batman are the same.\n" ); }  // 5) ä¸å¦ä¸ char æéæ¯è¾å串 { int compare_value{std::string{"Batman"}.compare(3, 3, "Superman")};  std::cout << ( compare_value < 0 ? "man comes before Superman\n" : compare_value > 0 ? "Superman comes before man\n" : "man and Superman are the same.\n" ); }  // 6) ä¸å¦ä¸ char æéå串æ¯è¾å串 { int compare_value{std::string{"Batman"}.compare(0, 3, "Superman", 5)};  std::cout << ( compare_value < 0 ? "Bat comes before Super\n" : compare_value > 0 ? "Super comes before Bat\n" : "Super and Bat are the same.\n" ); } }
è¾åºï¼
Batman comes before Superman Superman comes before man man and man are the same. Batman comes before Superman Superman comes before man Bat comes before Super
åé
| (C++20 ä¸ç§»é¤)(C++20 ä¸ç§»é¤)(C++20 ä¸ç§»é¤)(C++20 ä¸ç§»é¤)(C++20 ä¸ç§»é¤)(C++20) |
以åå
¸åºæ¯è¾ä¸¤ä¸ªå符串 (彿°æ¨¡æ¿) |
| è¿åå串 (å ¬å¼æå彿°) | |
| å®ä¹åå
¸åºæ¯è¾ååç¬¦ä¸²çæ£å (类模æ¿) | |
| æç
§å½åæ¬å°ç¯å¢æ¯è¾ä¸¤ä¸ªå符串 (彿°) | |
| å½ä¸ä¸ªèå´æåå
¸é¡ºåºå°äºå¦ä¸ä¸ªèå´æ¶ï¼è¿å true (彿°æ¨¡æ¿) |