C++實現(xiàn)高性能轉(zhuǎ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
可以看到,其性能有差異。(應用場景有限)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支持。
上一篇:Opencv基于CamShift算法實現(xiàn)目標跟蹤
欄 目:C語言
本文標題:C++實現(xiàn)高性能轉(zhuǎn)換大小寫算法示例
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1005.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設計-用棧實現(xiàn)表達式求值的方法詳解
- 01-10使用OpenGL實現(xiàn)3D立體顯示的程序代碼
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10求斐波那契(Fibonacci)數(shù)列通項的七種實現(xiàn)方法
- 01-10C語言 解決不用+、-、&#215;、&#247;數(shù)字運算符做加法
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10深入全排列算法及其實現(xiàn)方法


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10C#中split用法實例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?