成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

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

scwang90 / 2339人閱讀

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

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

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

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

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

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

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

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

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

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

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

regex 不支持 unicode,. 是無(wú)法匹配一個(gè)完整的code point 的

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

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

定義一個(gè)字符串常量

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

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

str = u"中文字符"

取得字符串長(zhǎng)度

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

這個(gè)就相當(dāng)于

len(u"中文")

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

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

首字母大寫(xiě)

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

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

這里定義的字符串并不能直接遍歷或者下標(biāo)訪問(wèn),因?yàn)樵趗nicode中什么一個(gè)“character“是有歧義的,把字符串看成一個(gè)數(shù)組是一個(gè)過(guò)時(shí)的想法(即便是16位的char)。字符串就沒(méi)有常量時(shí)間可隨機(jī)訪問(wèn)這么一說(shuō)。如果需要遍歷,需要這么寫(xiě)

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

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

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

這里的遍歷就類(lèi)似

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38192.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    XUI 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<