2013-12-10 48 views
-3
vector<string> tokenize(string in, string kar) { 

    string::iterator cp = in.begin(); 
    vector<string> oot; 

    while(cp != in.end()) { 

    while(cp != in.end() && count(kar.begin(), kar.end(), *cp)) 
     cp++; 
    if(cp != in.end()) 
     oot.push_back(string(cp, find_first_of(cp, in.end(), kar.begin(), kar.end()))); 
    cp = find_first_of(cp, in.end(), kar.begin(), kar.end()); 

    }; 

    return oot; 
}; 

有人可以解釋這一行:C++有人能解釋的字符串()

string(cp, find_first_of(cp, in.end(), kar.begin(), kar.end()) 

什麼用這一行的? 我不知道可以用這個單詞* cp替代這條線來代替那條長線。

+3

下面是引用鏈接。去閱讀它。 http://www.cplusplus.com/reference/string/string/string/ – OldProgrammer

回答

4

這條線有什麼用?

find_first_of發現任何字符的第一次出現在kar,從cp到字符串(給字符串的末尾,如果沒有找到)的端部。 kar包含用於分隔令牌的字符,因此它會查找以cp開頭的令牌的結尾。

然後創建一個字符串,其中包含cp以上的字符,但不包括找到的分隔符。這個字符串是一個單一的標記,所以把它推到我們要返回的標記序列上。

我不知道我們可以更換該行只用一個詞*cp

沒有,*cp是單個字符,沒有一個字。爲了獲得整個令牌,你需要找到令牌的末尾,這就是代碼的作用。

你可以只搜索令牌一旦結束簡化代碼:

if (cp != in.end()) { 
    string::iterator token_end = find_first_of(cp, in.end(), kar.begin(), kar.end()); 
    oot.push_back(string(cp, token_end)); 
    cp = token_end; 
} 
+0

+1,我的回答並不清楚如何找到工作... – Nim

2

這構建了基於兩個迭代器,cp開始迭代一個字符串,並first_first_of()結果,它看起來像它的範圍cp尋找第一個元素的範圍kar.begin() -> kar.end()結束串in的。

所以,不,你不能做什麼,你剛纔說的

1

該代碼(任何方式*cp是一個字符。):

string(cp, find_first_of(cp, in.end(), kar.begin(), kar.end()) 

創建一個無名(即,匿名)的實例std:: string`,使用提供的4個參數。

在更大範圍內在此尋找:

oot.push_back(string(cp, find_first_of(cp, in.end(), kar.begin(), kar.end()))); 

顯示,所構建的無名串然後被傳遞給push_back。此代碼完成後,未命名的string超出範圍並被銷燬 - 這是暫時的。