最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)高性能轉(zhuǎn)換大小寫算法示例

 更新時間:2018年01月03日 11:38:31   投稿:daisy  
大小寫轉(zhuǎn)換是我們作為一名程序員經(jīng)常會遇到,也必須要會的一個功能,下面這篇文章主要給大家介紹了關(guān)于C++實現(xiàn)高性能轉(zhuǎn)換大小寫算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。

簡述

最近工作中遇到一個需求,是需要將URL中的 query 參數(shù)的key全部轉(zhuǎn)換為小寫或者大寫,鍵值對的數(shù)量有點多,但全部都是英文字母,無需考慮非字母的情況。

實現(xiàn)比較快的做法是使用STL或C標準庫中的轉(zhuǎn)換接口,如下:

#include <string> 
#include <cctype> 
#include <algorithm>
// 字符串中的大寫字符轉(zhuǎn)小寫
std::string strtolower(std::string s)
{
 transform(s.begin(), s.end(), s.begin(), ::tolower);
 return s;
}
// 字符串中的小寫字符轉(zhuǎn)大寫
std::string strtoupper(std::string s)
{
 transform(s.begin(), s.end(), s.begin(), ::toupper);
 return s;
}

這個方法雖然很好,但是效率不是很高。

分析了一下ascii碼的碼值,發(fā)現(xiàn)大小寫字母的ascii碼之間是有規(guī)律的。

原理

英文字母的ASCII碼值表示如下


對比一下其二進制形式


從對比的結(jié)果可以看出, 大寫字母與小寫字母的差別 僅是 一個比特位的不同

因為它們的這個規(guī)律,可以寫出下面的轉(zhuǎn)換函數(shù)(如果輸入不是字母,轉(zhuǎn)出的結(jié)果會有錯誤)

可以查看數(shù)字 0-9 的ascii碼值,可以看出它們的第6位都是0,所以轉(zhuǎn)為小寫的算法不會影響數(shù)字的值。

轉(zhuǎn)小寫算法中受到影響的,只有ascii碼二進制表示中第六位為0的部分。其中非字母部分如下表


#include <iostream>
#include <string>
#include <stdint.h>
// 更優(yōu)化
std::string strtoupper(std::string s)
{
 if(s.empty()){return s;}
 size_t len = s.size() + 1;
 size_t alignlen = len + 8 - (len % 8);
 s.resize(alignlen);
 size_t ec = alignlen / 8;
 uint64_t* p8 = (uint64_t*)s.data();
 for(size_t i=0;i<ec;++i){
 p8[i] &= 0xDFDFDFDFDFDFDFDF;
 }
 s.resize(len-1);
 return s;
}
// 未做進一步優(yōu)化
std::string strtolower(std::string s)
{
 size_t len = s.size();
 size_t ec = len /8;
 uint64_t* p8 = (uint64_t*)s.data();
 for(size_t i=0;i<ec;++i){
 p8[i] |= 0x2020202020202020;
 }
 uint8_t* p1 = (uint8_t*)(p8 + ec);
 len %= 8;
 for(size_t i=0;i<len;++i){
 p1[i] |= 0x20;
 }
 return s;
}

性能測試

測試代碼如下:

int main()
{
 //std::cout << "Hello, world!\n";
 for(size_t i=0;i<1000000;++i){
 std::string s = strtoupper("qwertyuiopasdfghjklzxcvbnm````````QWERTYUIOPASDFGHJKLZXCVBNM");
 //std::cout<<s<<std::endl;
 s = strtolower("qwertyuiopasdfghjklzxcvbnm\t\t\t\t\t\t\t\tQWERTYUIOPASDFGHJKLZXCVBNM");
 //std::cout<<s<<std::endl;
 }
 return 0;
}

-- 編譯時候請勿優(yōu)化,否則可能被優(yōu)化掉! --

測試結(jié)果如下:

使用STL算法

STL算法部分主要由頭文件<algorithm>,<numeric>,<functional>組成。要使用 STL中的算法函數(shù)必須包含頭文件<algorithm>,對于數(shù)值算法須包含<numeric>,<functional>中則定義了一些模板類,用來聲明函數(shù)對象。

STL中算法大致分為四類:

       1、非可變序列算法:指不直接修改其所操作的容器內(nèi)容的算法。

       2、可變序列算法:指可以修改它們所操作的容器內(nèi)容的算法。

       3、排序算法:包括對序列進行排序和合并的算法、搜索算法以及有序序列上的集合操作。

       4、數(shù)值算法:對容器內(nèi)容進行數(shù)值計算。

結(jié)果如下

time ./teststl
./teststl 7.88s user 0.03s system 100% cpu 7.904 total

自寫代碼測試結(jié)果如下

time ./test
./test 0.93s user 0.00s system 99% cpu 0.928 total

可以看到,其性能有差異。(應(yīng)用場景有限)

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • C語言關(guān)系運算符實例詳解

    C語言關(guān)系運算符實例詳解

    本文主要介紹C語言的關(guān)系運算符的知識,這里提供實例代碼以便參考,希望能幫助有需要的小伙伴
    2016-07-07
  • C語言中條件判斷的正確使用姿勢

    C語言中條件判斷的正確使用姿勢

    在C語言中,有三種條件判斷結(jié)構(gòu):if語句、if-else語句和switch語句,這篇文章主要來和大家講解一下它們的正確使用姿勢,需要的可以參考一下
    2023-05-05
  • Qt基于QRencode實現(xiàn)生成二維碼

    Qt基于QRencode實現(xiàn)生成二維碼

    QRencode是一個開源的庫,專門用于生成二維碼(QR?Code),這篇文章主要為大家詳細介紹了Qt如何使用QRencode實現(xiàn)生成二維碼功能,需要的可以參考下
    2025-02-02
  • C++文件的操作及小實驗示例代碼詳解

    C++文件的操作及小實驗示例代碼詳解

    這篇文章主要介紹了C++文件的操作及小實驗,對于文件,它是一個流對象,對文件的操作無非是讀和寫,通過本文的學(xué)習(xí)大家將會理解文件的具體操作
    2022-05-05
  • C++ 哈夫曼樹對文件壓縮、加密實現(xiàn)代碼

    C++ 哈夫曼樹對文件壓縮、加密實現(xiàn)代碼

    這篇文章主要介紹了C++ 哈夫曼樹對文件壓縮、加密實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C++ OpenCV實戰(zhàn)之制作九宮格圖像

    C++ OpenCV實戰(zhàn)之制作九宮格圖像

    本文將為大家介紹如何使用OpenCV C++ 制作九宮格圖像,即將一張圖像均等分成九份,然后將這九個小塊按一定間隔拷貝到新畫布上就可以啦。感興趣的可以動手試一試
    2022-01-01
  • 用C語言實現(xiàn)排雷游戲

    用C語言實現(xiàn)排雷游戲

    大家好,本篇文章主要講的是用C語言實現(xiàn)排雷游戲,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++編程模板匹配超詳細的識別手寫數(shù)字實現(xiàn)示例

    C++編程模板匹配超詳細的識別手寫數(shù)字實現(xiàn)示例

    大家好!本篇文章是關(guān)于手寫數(shù)字識別的,接下來我將在這里記錄我的手寫數(shù)字識別的從零到有,我在這里把我自己的寫代碼過程發(fā)出來,希望能幫到和我一樣努力求知的人
    2021-10-10
  • Qt實現(xiàn)小功能之圓形進度條的方法詳解

    Qt實現(xiàn)小功能之圓形進度條的方法詳解

    在Qt自帶的控件中,只有垂直進度條、水平進度條兩種。在平時做頁面開發(fā)時,有些時候會用到圓形進度條,比如說:下載某個文件的下載進度。本文就來實現(xiàn)一個圓形進度條,需要的可以參考一下
    2022-10-10
  • C++判斷一個點是否在圓內(nèi)的方法

    C++判斷一個點是否在圓內(nèi)的方法

    這篇文章主要為大家詳細介紹了C++判斷一個點是否在圓內(nèi)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評論

体育| 汽车| 嘉义县| 南皮县| 如东县| 巴东县| 泰和县| 晋中市| 甘南县| 阿克苏市| 阿拉善盟| 太和县| 平远县| 海盐县| 龙井市| 吉安县| 台湾省| 崇州市| 大宁县| 封开县| 海盐县| 马龙县| 厦门市| 贺州市| 乌恰县| 龙岩市| 玉溪市| 长岭县| 乐山市| 安阳市| 固镇县| 丰镇市| 奉新县| 温宿县| 阳泉市| 济南市| 钦州市| 南投市| 洮南市| 萨迦县| 扶余县|