C++ String封裝

來源:互聯網
上載者:User

標籤:end   blog   string   basic   本地   資料庫   oid   ++   cout   

為什麼要自己封裝個String類?原因很多。QT庫有自己的QString類,MFC有自己的CString類。STL標準庫有自己的std::string類。MySQL資料庫的C API介面使用原生的char*指標。。。。。。

自己寫的程式用那種String?沒法選擇。這時候可能需要寫一個萬能的String類和對接其它字串類的介面。另一個原因是,效率問題;想獲得最高的效率。還有就是本地化,國際化等原因。

從C++98開始,程式員們就開始造String輪子,方便自己學習和熟悉新的C++知識。現在我們用C++17的時髦思路,封裝一個自己的String類。代碼如下:

#include <iostream>#include <cstdlib>#include <string>#include <variant>#include <array>#include <cstring> //for std::strlen#include <string_view>
class String{private: enum{ object_size = sizeof(std::string) }; using string=std::string; using array=std::array<char,object_size> ; std::variant<std::monostate, string, array > data_; void set_data(const char* src) { if (src==nullptr){ data_.emplace<array>(); auto& a = std::get<array>(data_); a[0]=0; } else if (std::strlen(src)>=object_size){ data_.emplace<string>(src); } else{ data_.emplace<array>(); auto& a = std::get<array>(data_); std::copy(src,src+std::strlen(src),a.begin()); a[std::strlen(src)]=0; } } public: String(const char* src){ set_data(src); } void operator=(const char* src){ set_data(src); } const char* c_str(){ const char* ret = nullptr; switch (data_.index()){ case 1: ret = std::get<string>(data_).c_str(); break; case 2: ret = std::get<array>(data_).begin(); break; } return ret; } std::string_view str(){ switch (data_.index()){ case 0: return std::string_view(); case 1: return std::string_view(std::get<string>(data_)); case 2: return std::string_view(std::get<array>(data_).begin()); } }};int main(){ String s("12345"); std::cout << s.c_str() << std::endl; s = "..............................hello world!"; auto v1 = s.str(); auto v2 = v1.substr(v1.find_first_not_of(‘.‘)); std::cout << v2 << std::endl;}

現在分析一下,有哪些時髦(Modern)的地方。

1)使用了variant,這個東西就是超級的union體。當字串長度較小時,我們用std::array的不malloc()的喜感;當字串長度較長時,我們用std::string的動態記憶體便利性。

2)string_view。這個是從boost::string_ref移植過來的好東西。

3)屏蔽了底層的技術細節。發明這個東西,不再需要什麼placement new之類的胡言論語。

char buf_[64];new (buf_) std::string("12345");  reinterpret_cast<std::string*>(buf_)->~basic_string();  

4)剩下的功能,請盡情的改造吧

C++ String封裝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.