国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【1】 pythonic modern c++:字符串

scwang90 / 2316人閱讀

摘要:我希望的是類似中文字符這樣的使用體驗。中文中文這里的遍歷就類似中文中文我們這里干的事情類似于里兩種類型的區(qū)分。

致力于在現(xiàn)代C++中提供Python的編程體驗。這個建立在兩個關(guān)鍵的基礎(chǔ)上

c++ 11/14/17 提供了從 auto 到 structure binding 的語法便利

https://ericniebler.github.io... 提供的 range 抽象

但是 python 體驗是建立在語言內(nèi)建的大量方便函數(shù)的基礎(chǔ)之上的。而 Modern C++ 還缺少大量使用起來方便的庫。

我們今天要來解決的第一個問題是如何在C++中表達字符串。選擇一個字符串的實現(xiàn)主要有三方面的考慮:

是值對象還是引用對象:std::string 是值對象,std::string_view 是引用對象。值對象即便用上了所有的優(yōu)化(stack分配內(nèi)存,ref counted cow)仍然是有開銷的。在該使用應(yīng)用的地方,仍然應(yīng)該使用引用。

值對象的內(nèi)存管理。folly::fbstring 就比 std::string 更好地利用了內(nèi)存

支持 unicode:不應(yīng)該把字符串簡單看成一個char數(shù)組

市面上幾乎所有的string抽象對unicode支持都不好。我希望的是類似u"中文字符"這樣的使用體驗。c++ 11/14/17 在unicode支持方面支持得非常有限:

雖然引入了char16_t 和 char32_t,但是你以為字符串就是 vector 就太天真了。使用的時候需要各種字符轉(zhuǎn)換到char32_t不說,而且locale居然不支持char32_t,意味著基本的toupper都無法實現(xiàn)

regex 不支持 unicode,. 是無法匹配一個完整的code point 的

https://github.com/CaptainCro... 這個封裝是最接近的,但是不是基于 range-v3 的。

目前的我實現(xiàn)的代碼在:https://github.com/taowen/pyt...

定義一個字符串常量

auto str = U8("中文字符");

U8是一個宏,可以保證u8""這樣字符串聲明(c++ 編譯器支持的 utf8 編碼),同時額外做的工作是讓構(gòu)造出來的字符串和普通的字符串類型不兼容,避免誤用。也就是 string != unicode 。這個就相當(dāng)于

str = u"中文字符"

取得字符串長度

CHECK(2 == (U8("中文") | pyn::len));

這個就相當(dāng)于

len(u"中文")

如果不喜歡 | 的調(diào)用語法,也可以用普通的函數(shù)

pyn::len(U8("中文"));

首字母大寫

CHECK(U8("Hello") == (U8("hello") | utf8::capitalize | utf8::to_text));

注意這里 capitalize 并不會立即返回一個新的字符串(分配一個新的內(nèi)存空間,然后拷貝字符),而是返回了一個類似python generator的東西。在 to_text 的時候才會分配內(nèi)存,進行計算。默認(rèn) to_text 返回的字符串類型是 utf8::Text 底層存儲是 folly::fbstring

這里定義的字符串并不能直接遍歷或者下標(biāo)訪問,因為在unicode中什么一個“character“是有歧義的,把字符串看成一個數(shù)組是一個過時的想法(即便是16位的char)。字符串就沒有常量時間可隨機訪問這么一說。如果需要遍歷,需要這么寫

auto chars = std::vector{};
for (auto c : U8("abc") | utf8::code_units) {
    chars.push_back(c);
}
CHECK((std::vector{"a", "b", "c"}) == chars);

這個取得的是code unit,在非ascii范圍內(nèi)的字符會讀取不完整。

auto chars = std::vector{};
for (auto c : U8("中文") | utf8::code_points) {
    chars.push_back(c);
}
CHECK((std::vector{U8("中"), U8("文")}) == chars);

這里的遍歷就類似

chars = []
for c in u"中文":
  chars.append(c)
[u"中", u"文"] == c

我們這里干的事情類似于python 2.7 里 string/unicode 兩種類型的區(qū)分。我們需要一種存儲上是string(utf8編碼),但是使用起來類似 unicode 的抽象。目前來看,前途光明。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/38192.html

相關(guān)文章

  • 15個流行編程語言及其應(yīng)用

    摘要:之前自己一直在找自己感興趣的方向,以及在這個方向上流行的語言并嘗試學(xué)習(xí)這些語言其中的幾個但是沒有什么重大發(fā)現(xiàn),這篇文章主要介紹了個出現(xiàn)在個編程語言排行榜的編程語言和他們的擅長的領(lǐng)域,他們分別是排名不分先后,,,,,,,,,,,,,。 之前自己一直在找自己感興趣的方向,以及在這個方向上流行的語言并嘗試學(xué)習(xí)這些語言其中的幾個但是沒有什么重大發(fā)現(xiàn),這篇文章主要介紹了15個出現(xiàn)在3個編程語言排...

    tinyq 評論0 收藏0
  • 15個流行編程語言及其應(yīng)用

    摘要:之前自己一直在找自己感興趣的方向,以及在這個方向上流行的語言并嘗試學(xué)習(xí)這些語言其中的幾個但是沒有什么重大發(fā)現(xiàn),這篇文章主要介紹了個出現(xiàn)在個編程語言排行榜的編程語言和他們的擅長的領(lǐng)域,他們分別是排名不分先后,,,,,,,,,,,,,。 之前自己一直在找自己感興趣的方向,以及在這個方向上流行的語言并嘗試學(xué)習(xí)這些語言其中的幾個但是沒有什么重大發(fā)現(xiàn),這篇文章主要介紹了15個出現(xiàn)在3個編程語言排...

    enrecul101 評論0 收藏0
  • 15個流行編程語言及其應(yīng)用

    摘要:之前自己一直在找自己感興趣的方向,以及在這個方向上流行的語言并嘗試學(xué)習(xí)這些語言其中的幾個但是沒有什么重大發(fā)現(xiàn),這篇文章主要介紹了個出現(xiàn)在個編程語言排行榜的編程語言和他們的擅長的領(lǐng)域,他們分別是排名不分先后,,,,,,,,,,,,,。 之前自己一直在找自己感興趣的方向,以及在這個方向上流行的語言并嘗試學(xué)習(xí)這些語言其中的幾個但是沒有什么重大發(fā)現(xiàn),這篇文章主要介紹了15個出現(xiàn)在3個編程語言排...

    hlcfan 評論0 收藏0
  • 15個流行編程語言及其應(yīng)用

    摘要:之前自己一直在找自己感興趣的方向,以及在這個方向上流行的語言并嘗試學(xué)習(xí)這些語言其中的幾個但是沒有什么重大發(fā)現(xiàn),這篇文章主要介紹了個出現(xiàn)在個編程語言排行榜的編程語言和他們的擅長的領(lǐng)域,他們分別是排名不分先后,,,,,,,,,,,,,。 之前自己一直在找自己感興趣的方向,以及在這個方向上流行的語言并嘗試學(xué)習(xí)這些語言其中的幾個但是沒有什么重大發(fā)現(xiàn),這篇文章主要介紹了15個出現(xiàn)在3個編程語言排...

    wangbjun 評論0 收藏0
  • 從賀老微博引出的“遍歷器(Iterators)加速那些奧秘”

    摘要:我關(guān)注的賀老賀師俊前輩最近發(fā)表個這樣一條微博雖然這條微博沒有引起大范圍的關(guān)注和討論,但是作為新人,我陷入了思考。通過賀老的微博,對一個問題進行探究,最終找到核心成員的一文,進行參考并翻譯。 我關(guān)注的賀老—賀師俊前輩@johnhax 最近發(fā)表個這樣一條微博: showImg(https://segmentfault.com/img/remote/1460000010452807); 雖然...

    XUI 評論0 收藏0

發(fā)表評論

0條評論

scwang90

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<