c++ string类_C++|细说STL string类概貌及底层细节
C語言中的字符串稱為C風格字符串,是一個以'0'結尾的字符數組,string.h庫只提供了有限、不甚安全的字符串操作函數。char str[]只能定義編譯期確定大小的字符串,而保存在堆內存的動態字符數組卻需要考慮釋放內存的問題,且想要實現自變長的彈性大小也存在諸多紛繁的操作細節。C++ STL中的string類一攬子解決了諸如此類的問題。除此以外,STL算法通過traits和iterator中間層來操作各類容器,也包括string。
C++中常用的string類其實是一個typedef:
typedef basic_string string;basic_string是STL中的類模板,用char實例化這個類模板,取別名為string。
之所以在String中定義basic_string模板類,而不是直接的string模板類,是因為其考慮處理的容器元素,不單只是一個字節的ASCII字符,還有寬字符wchar_t以及char16_t、char32_t或unsigned char等。
1 封裝字符串的由來
1.1 不封裝的缺陷
char *cp = "abc"; // 其實是const,字面量"abc"并不存儲在棧區,而是常量區//cp[2] = 'D'; // errorchar arr[4] = "abc"; // 固定大小int size = 4;char *dp = new char[size];dp[0]='a';dp[1]='b';dp[2]='c';dp[3]='0';cout<1.2 封裝為類:可變長、并自動釋放堆內存
封裝一個字符指針,由這個指針指向一塊new出來的堆內存,并按傳入的字符串字面量復制入這塊堆內存。
// string.h#ifndef __MYSTRING__#define __MYSTRING__class String{public: String(const char* cstr=0); String(const String& str); String& operator=(const String& str); ~String(); char* get_c_str() const { return m_data; }private: char* m_data;};#include inlineString::String(const char* cstr){ if (cstr) { m_data = new char[strlen(cstr)+1]; strcpy(m_data, cstr); } else { m_data = new char[1]; *m_data = '0'; }}inlineString::~String(){ delete[] m_data;}inlineString& String::operator=(const String& str){ if (this == &str) return *this; delete[] m_data; m_data = new char[ strlen(str.m_data) + 1 ]; strcpy(m_data, str.m_data); return *this;}inlineString::String(const String& str){ m_data = new char[ strlen(str.m_data) + 1 ]; strcpy(m_data, str.m_data);}// String_test.cpp#include using namespace std;ostream& operator<using namespace std;int main(){ String s1("hello"); String s2("world"); String s3(s2); cout << s3 << endl; s3 = s1; cout << s3 << endl; cout << s2 << endl; cout << s1 << endl; String *p = new String[3]; p[0] = "We"; p[1] = "are"; p[2] = "one"; char* str = p[2].get_c_str(); cout << str << endl; delete[] p; cin.get();}/*worldhelloworldhelloone*/進一步,可以封裝為類模板,可以訪問不同的字符類型。
2 STL
STL string模板類在上述基礎上實現了類型泛化,并封裝了很多的成員函數,且有STL算法庫中的函數模板支持。
2.1 兩個類模板
basic_string Generic string class (class template )
char_traits Character traits (class template )
2.2 模板類4個
string String class (class )
u16string String of 16-bit characters (class )
u32string String of 32-bit characters (class )
wstring Wide string (class )
2.3 轉換函數或函數模板
stoi Convert string to integer (function template )
stol Convert string to long int (function template )
stoul Convert string to unsigned integer (function template )
stoll Convert string to long long (function template )
stoull Convert string to unsigned long long (function template )
stof Convert string to float (function template )
stod Convert string to double (function template )
stold Convert string to long double (function template )
to_string Convert numerical value to string (function )
to_wstring Convert numerical value to wide string (function )
3 basic_string模板類
basic_string模板類聲明:
template < class charT, class traits = char_traits, // basic_string::traits_type class Alloc = allocator // basic_string::allocator_type > class basic_string;?basci_string封裝一根指向字符類型的指針,也就是管理一個以'0'結尾的字符動態數組,有了諸多操作的封裝,中間層有迭代器iterator和萃取器traits,traits用于迭代器、型別等的提取,iterator用于封裝一個basci_string容器類對象指針,一些獨立于容器的算法可以通過迭代器來操作容器元素。
char_traits用于類模板容器元素的型別選擇,也是一個模板類:
template struct char_traits;template <> struct char_traits;template <> struct char_traits;template <> struct char_traits;template <> struct char_traits;該特性類別規定了“復制字符”或“比較字符“的做法,如果不指定該特性類別,會根據現有的字符型別采用默認的特性類別。
其成員函數包括:
eqCompare characters for equality ( public static member function )ltCompare characters for inequality ( public static member function )lengthGet length of null-terminated string ( public static member function )assignAssign character ( public static member function )compareCompare sequences of characters ( public static member function )findFind first occurrence of character ( public static member function )moveMove character sequence ( public static member function )copyCopy character sequence ( public static member function )eofEnd-of-File character ( public static member function )not_eofNot End-of-File character ( public static member function )to_char_typeTo char type ( public static member function )to_int_typeTo int type ( public static member function )eq_int_typeCompare int_type values ( public static member function )實例:
// char_traits::compare#include // std::cout#include // std::basic_string, std::char_traits#include // std::tolower#include // std::size_t// case-insensitive traits:struct custom_traits: std::char_traits { static bool eq (char c, char d) { return std::tolower(c)==std::tolower(d); } static bool lt (char c, char d) { return std::tolower(c)<:tolower static int compare char p const q std::size_t n while if return lt main std::basic_string> foo,bar; foo = "Test"; bar = "test"; if (foo==bar) std::cout << "foo and bar are equal"; return 0;}// output: // char_traits::compareallocator有默認值,定義字符串類別所采用的內存模式,將容器與物理存儲細節分隔,提供了一套分配與釋放堆內存的標準方式,其型別為charT,可以是char、wchar_t、char16_t、char32_t。
類模板實例化的模板類:
stringString class (class )wstringWide string (class )u16string String of 16-bit characters (class )u32string String of 32-bit characters (class )所用字符串類型均使用相同接口,用法和問題都一樣,以下是部分成員函數:
(constructor)Construct basic_string object (public member function )(destructor)String destructor (public member function )operator=String assignment (public member function )sizeReturn size (public member function )lengthReturn length of string (public member function )operator[]Get character of string (public member function )atGet character of string (public member function )operator+=Append to string (public member function )appendAppend to string (public member function )push_backAppend character to string (public member function )insertInsert into string (public member function )replaceReplace portion of string (public member function )c_strGet C-string equivalentfindFind first occurrence in string (public member function )rfindFind last occurrence in string (public member function )substrGenerate substring (public member function )compareCompare strings (public member function )operator+Concatenate strings (function template )operator>>Extract string from stream (function template )getlineGet line from stream into string (function template )4 string類
string類是使用char(即字節)作為其字符類型的basic_string類模板的一個實例化,其有默認char_traits和分配器類型。
其迭代器為a random access iterator to char。
string提供的接口類似于標準字節容器的接口,但添加了專門設計用于使用單字節字符字符串操作的功能。
string類獨立于使用的編碼處理字節,如果用于處理多字節或可變長度字符(如UTF-8)的序列,則該類的所有成員(如長度或大小)及其迭代器仍將按字節(而不是實際的編碼字符)操作。string類的型別雖是char,但因為char是一個字節,其有天然的按字節(byte)處理的優勢,也是漢字等一些其它編碼的字符能被string類處理的原因,處理完后再按其原本的編碼解析即可。
wstring類是使用wchar_t(即字節)作為其字符類型的basic_string類模板的一個實例化。
在Windows下,wchar_t占2個字節(byte);在Linux下,wchar_t占4個字節。
u16string、u32string則是確定長度的寬字節類型。
wstring、u16string、u32string類有與string類相同接口的成員函數。
-End-
總結
以上是生活随笔為你收集整理的c++ string类_C++|细说STL string类概貌及底层细节的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python与javascript的区别
- 下一篇: python asyncio tcp s