2013-11-20 48 views
1

我很困惑,當我設置它,我是否應該增加一個輸出迭代。看到下面的代碼,我試圖分割一個字符串。我的問題是與while循環的第三行,代碼似乎好工作我是否* OIT = ...或* OIT ++ = ... 有人能向我解釋,爲什麼?遞增back_inserter是可選的?

template<class O> void split(string& s, O oit){ 

     string::iterator jt, it = s.begin(); 

    while(1){ 
     jt = find(it, s.end(), ' '); 
     if(it == s.end() && jt == s.end()) return; 
     *oit++ = string(it, jt); 
     it = jt; 
     if(it != s.end()) it++; 
    } 
} 

...

int main(){ 

     string s; 
     getline(cin, s); 

     vector<string> v; 

     split(s, back_inserter(v)); 
     copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n"));   

} 

回答

3

std::back_inserter創建通過對底層集合調用push_back插入一個迭代器。這意味着增量對於正常工作不是必需的。

同樣是沒有其他輸出迭代的一定是真實的,所以你的代碼是正確的,就應該儘管在這種特定情況下它基本上忽略了執行增量事件。

只是爲了它的價值,在這個特殊的情況下,你可以得到相同的效果基本與少了很多/簡單的代碼:

string s; 
getline(cin, s); 

replace(s, ' ', '\n'); 
cout << s; 
3

的概念,您需要增加一個輸出迭代器每個寫信給你做。雖然std::back_insert_iterator<T>可以相應的對象上的每個任務調用push_back()*it,這個概念仍然要求該增量運算符被調用。原則上,輸出迭代器可能是函數調用,但以適應由指針也採用了相同的接口,他們需要支持相同的操作。

std::back_insert_iterator<Cont>的規範規定,在基礎類型typename Cont::value_type電話cont.push_back(value)的每項任務,operator*()剛剛返回迭代器本身一樣,operator++()

0

這兩部分工作,因爲標準的迭代器的設計與泛型編程使用時,在功能上等同於原始指針。當使用原始指針時,它們必須遞增才能到達後續地址。