久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

std::string的工具函數(shù)

 勤奮不止 2013-08-27
std::string的工具函數(shù)
羅索客 發(fā)布于 2009-10-26 17:38 點擊:2386次 
來自:網(wǎng)絡(luò)博客
一般來說,,在處理字符串的時候通常會用到如下一些函數(shù)/方法:length、substring,、find、charAt,、 toLowerCase,、toUpperCase、trim,、equalsIgnoreCase,、startsWith、endsWith,、 parseInt,、toString、split等,。
TAG: STL  

一般來說,,在處理字符串的時候通常會用到如下一些函數(shù)/方法:length、substring,、find,、charAt、 toLowerCase,、toUpperCase,、trim、equalsIgnoreCase,、startsWith,、endsWith、 parseInt,、toString,、split等,。
  如果使用STL中的std::string,它已經(jīng)提供了如下一些比較有用的方法:
length(),,取得字符串的長度,。
substr(),從字符串中取出一個子串,。
at()/operator [],,取得字符串中指定位置的字符。
find/rfind(),,從前往后/從后往前在字符串中查找一個子串的位置,。
find_first_of(),在字符串中找到第一個在指定字符集中的字符位置,。
find_first_not_of(),,在字符串中找到第一次人不在指定字符集中的字符位置。
find_last_of(),,在字符串中找到最后一個在指定字符集中的字符位置,。
find_last_not_of(),在字符串中找到最后一個不在字符集中的字符位置,。
  關(guān)于std::string的其它方法,,請參閱它的文檔(在MSDN中可以找到)。
  很容易發(fā)現(xiàn),,std::string并沒有提供所有需要方法,。所以,需要用STL提供了算法庫,、字符串流以及現(xiàn)存的std::string的方法來實現(xiàn)它們,。
※ 將字符串轉(zhuǎn)換為大寫/小寫
std::transform(str.begin(), str.end(), str.begin(), tolower);
std::transform(str.begin(), str.end(), str.begin(), toupper);
※ 去掉字符串兩端的空格
1) 去掉左邊的空格 
str.erase(0, str.find_first_not_of(" \\t\\n\\r"));
2) 去掉右邊的空格
str.erase(str.find_last_not_of(" \\t\\n\\r"+ 1);
3) 去掉兩邊的空格
str.erase(0, str.find_first_not_of(" \\t\\n\\r")).erase(str.find_last_not_of(" \\t\\n\\r"+ 1);
※ 忽略大小寫比較字符串
  這一功能的實現(xiàn)比較簡單,只需要先將用于比較的兩個字符串各自拷貝一個復(fù)本,,并將這兩個復(fù)本轉(zhuǎn)換為小寫,,然后比較轉(zhuǎn)換為小寫之后的兩個字符串即可。
※ StartsWith和EndsWith
1) StartsWith
str.find(substr) == 0;
如果返回值為true,,則str是以substr開始的
2) EndsWith
str.rfind(substr) == (str.length() - substr.length());
如果返回值為true,,則str是以substr結(jié)束的
  還有另一個方法可以實現(xiàn)這兩個函數(shù)。就是將str從頭/尾截取substr長度的子串,,再將這個子串也substr進(jìn)行比較,。不過這種方法需要判斷str的長度是否足夠,所以建議用find和rfind來實現(xiàn),。
※ 從字符串解析出int和bool等類型的值
  說到將字符串解析成int,,首先想到的一定是atoi、atol等C函數(shù),。如果用C++來完成這些工具函數(shù),,那就要用到std::istringstream,。
  除了解析bool值之外,下面這個函數(shù)可以解析大部分的類型的數(shù)值:
template<class T> parseString(const std::string& str) {
    T value;
    std::istringstream iss(str);
    iss 
>> value;
    
return value;
}
  上面這個模板可以將0解析成bool值false,,將非0解析成treu,。但它不能將字符串"false"解析成false,將"true"解析成true,。因此要用一個特別的函數(shù)來解析bool型的值:
template<bool>
bool parseString(const std::string& str) {
    
bool value;
    std::istringstream iss(str);
    iss 
>> boolalpha >> value;
    
return value;
}
  上面的函數(shù)中,向輸入流傳入一個std::boolalpha標(biāo)記,,輸入流就能認(rèn)識字符形式的"true"和"false"了,。
  使用與之類似的辦法解析十六進(jìn)制字符串,需要傳入的標(biāo)記是std::hex:
template<class T> parseHexString(const std::string& str) {
    T value;
    std::istringstream iss(str);
    iss 
>> hex >> value;
    
return value;
}
※ 將各種數(shù)值類型轉(zhuǎn)換成字符串(toString)
  與解析字符串類似,,使用std::ostringstream來將各種數(shù)值類型的數(shù)值轉(zhuǎn)換成字符串,,與上面對應(yīng)的3個函數(shù)如下: 
template<class T> std::string toString(const T& value) {
    std::ostringstream oss;
    oss 
<< value;
    
return oss.str();
}
string toString(const bool& value) {
    ostringstream oss;
    oss 
<< boolalpha << value;
    
return oss.str();
}
template
<class T> std::string toHexString(const T& value, int width) {
    std::ostringstream oss;
    oss 
<< hex;
    
if (width > 0) {
        oss 
<< setw(width) << setfill('0');
    }
    oss 
<< value;
    
return oss.str();
}
   注意到上面函數(shù)中用到的setw和setfill沒有?它們也是一種標(biāo)記,,使用的時候需要一個參數(shù),。std::setw規(guī)定了向流輸出的內(nèi)容占用的寬 度,如果輸出內(nèi)容的寬度不夠,,默認(rèn)就用空格填位,。std::setfill則是用來設(shè)置占位符。如果還需要控制輸出內(nèi)容的對齊方式,,可以使用std:: left和std::right來實現(xiàn),。
※ 拆分字符串和Tokenizer
  拆分字符串恐怕得用Tokenizer來實現(xiàn)。C提供了strtok來實現(xiàn)Tokenizer,,在STL中,,用std::string的find_first_of和find_first_not_of來實現(xiàn)。下面就是Tokenizer類的nextToken方法:
bool Tokenizer::nextToken(const std::string& delimiters) {
    
// find the start character of the next token.
    size_t i = m_String.find_first_not_of(delimiters, m_Offset);
    
if (i == string::npos) {
        m_Offset 
= m_String.length();
        
return false;
    }

    
// find the end of the token.
    size_t j = m_String.find_first_of(delimiters, i);
    
if (j == string::npos) {
        m_Token 
= m_String.substr(i);
        m_Offset 
= m_String.length();
        
return true;
    }

    
// to intercept the token and save current position
    m_Token = m_String.substr(i, j - i);
    m_Offset 
= j;
    
return true;
}
※ 源代碼
  最后,,關(guān)于上述的一些方法,,都已經(jīng)實現(xiàn)在strutil.h和strutil.cpp中,所以現(xiàn)在附上這兩個文件的內(nèi)容:
√Header file: strutil.h
////////////////////////////////////////////////////////////////////////////////
//
// Utilities for std::string
// defined in namespace strutil
// by James Fancy
//
////////////////////////////////////////////////////////////////////////////////

#pragma once

#include 
<string>
#include 
<vector>
#include 
<sstream>
#include 
<iomanip>

// declaration
namespace strutil {

    std::
string trimLeft(const std::string& str);
    std::
string trimRight(const std::string& str);
    std::
string trim(const std::string& str);

    std::
string toLower(const std::string& str);
    std::
string toUpper(const std::string& str);

    
bool startsWith(const std::string& str, const std::string& substr);
    
bool endsWith(const std::string& str, const std::string& substr);
    
bool equalsIgnoreCase(const std::string& str1, const std::string& str2);

    template
<class T> T parseString(const std::string& str);
    template
<class T> T parseHexString(const std::string& str);
    template
<bool> bool parseString(const std::string& str);

    template
<class T> std::string toString(const T& value);
    template
<class T> std::string toHexString(const T& value, int width = 0);
    std::
string toString(const bool& value);

    std::vector
<std::string> split(const std::string& str, const std::string& delimiters);
}

// Tokenizer class
namespace strutil {
    
class Tokenizer
    {
    
public:
        
static const std::string DEFAULT_DELIMITERS;
        Tokenizer(
const std::string& str);
        Tokenizer(
const std::string& str, const std::string& delimiters);

        
bool nextToken();
        
bool nextToken(const std::string& delimiters);
        
const std::string getToken() const;

        
/**
        * to reset the tokenizer. After reset it, the tokenizer can get
        * the tokens from the first token.
        
*/
        
void reset();

    
protected:
        size_t m_Offset;
        
const std::string m_String;
        std::
string m_Token;
        std::
string m_Delimiters;
    };

}

// implementation of template functions
namespace strutil {

    template
<class T> T parseString(const std::string& str) {
        T value;
        std::istringstream iss(str);
        iss 
>> value;
        
return value;
    }

    template
<class T> T parseHexString(const std::string& str) {
        T value;
        std::istringstream iss(str);
        iss 
>> hex >> value;
        
return value;
    }

    template
<class T> std::string toString(const T& value) {
        std::ostringstream oss;
        oss 
<< value;
        
return oss.str();
    }

    template
<class T> std::string toHexString(const T& value, int width) {
        std::ostringstream oss;
        oss 
<< hex;
        
if (width > 0) {
            oss 
<< setw(width) << setfill('0');
        }
        oss 
<< value;
        
return oss.str();
    }

}
√Source file: strutil.cpp 
////////////////////////////////////////////////////////////////////////////////
//
// Utilities for std::string
// defined in namespace strutil
// by James Fancy
//
////////////////////////////////////////////////////////////////////////////////

#include 
"strutil.h"

#include 
<algorithm>

namespace strutil {

    
using namespace std;

    
string trimLeft(const string& str) {
        
string t = str;
        t.erase(
0, t.find_first_not_of(" \\t\\n\\r"));
        
return t;
    }

    
string trimRight(const string& str) {
        
string t = str;
        t.erase(t.find_last_not_of(
" \\t\\n\\r"+ 1);
        
return t;
    }

    
string trim(const string& str) {
        
string t = str;
        t.erase(
0, t.find_first_not_of(" \\t\\n\\r"));
        t.erase(t.find_last_not_of(
" \\t\\n\\r"+ 1);
        
return t;
    }

    
string toLower(const string& str) {
        
string t = str;
        transform(t.begin(), t.end(), t.begin(), tolower);
        
return t;
    }

    
string toUpper(const string& str) {
        
string t = str;
        transform(t.begin(), t.end(), t.begin(), toupper);
        
return t;
    }

    
bool startsWith(const string& str, const string& substr) {
        
return str.find(substr) == 0;
    }

    
bool endsWith(const string& str, const string& substr) {
        
return str.rfind(substr) == (str.length() - substr.length());
    }

    
bool equalsIgnoreCase(const string& str1, const string& str2) {
        
return toLower(str1) == toLower(str2);
    }

    template
<bool>
    
bool parseString(const std::string& str) {
        
bool value;
        std::istringstream iss(str);
        iss 
>> boolalpha >> value;
        
return value;
    }

    
string toString(const bool& value) {
        ostringstream oss;
        oss 
<< boolalpha << value;
        
return oss.str();
    }

    vector
<string> split(const string& str, const string& delimiters) {
        vector
<string> ss;

        Tokenizer tokenizer(str, delimiters);
        
while (tokenizer.nextToken()) {
            ss.push_back(tokenizer.getToken());
        }

        
return ss;
    }

}

namespace strutil {

    
const string Tokenizer::DEFAULT_DELIMITERS(" ");

    Tokenizer::Tokenizer(
const std::string& str)
        : m_String(str), m_Offset(
0), m_Delimiters(DEFAULT_DELIMITERS) {}

    Tokenizer::Tokenizer(
const std::string& str, const std::string& delimiters)
        : m_String(str), m_Offset(
0), m_Delimiters(delimiters) {}

    
bool Tokenizer::nextToken() {
        
return nextToken(m_Delimiters);
    }

    
bool Tokenizer::nextToken(const std::string& delimiters) {
        
// find the start charater of the next token.
        size_t i = m_String.find_first_not_of(delimiters, m_Offset);
        
if (i == string::npos) {
            m_Offset 
= m_String.length();
            
return false;
        }

        
// find the end of the token.
        size_t j = m_String.find_first_of(delimiters, i);
        
if (j == string::npos) {
            m_Token 
= m_String.substr(i);
            m_Offset 
= m_String.length();
            
return true;
        }

        
// to intercept the token and save current position
        m_Token = m_String.substr(i, j - i);
        m_Offset 
= j;
        
return true;
    }

    
const string Tokenizer::getToken() const {
        
return m_Token;
    }

    
void Tokenizer::reset() {
        m_Offset 
= 0;
    }

}
(佚名)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多