2013-09-05 50 views
10

我使用一個循環來計算一個單詞輸入的次數,然後打印該單詞以及它輸入了多少次,這是有效的,但它從不打印最後一個單詞,我有它按字母順序排序。在打印最後一個單詞之前,錯誤指出迭代器不可忽略。這裏是我的循環代碼:矢量迭代器在循環中不可忽略

for (vector<string>::iterator it = v.begin() ; it != v.end(); ++it) 
    { 
     if (*it == *(it+1)) 
     { 
     count++; 
     } 
     else if (*it != *(it+1)) 
     { 
       count++; 
      cout << *it << " ---- " << count << endl; 
      count=0; 
     } 
    } 

回答

16

你的代碼是未定義行爲 - 想象it指向的v最後一個元素,那麼您要提領v.end()*(it+1)

if (*it != *(it+1) 

STL迭代器,end不指向最後一個元素; end()返回一個代表容器中元素結束的迭代器。最後是後面的最後一個元素。這樣的迭代器也被稱爲過去式迭代器

因此,開始()和end()定義了一個半開範圍包括第一元素,但排除最後

-------------------------------- 
| | | | | | | | | 
-------------------------------- 
    /\        /\  
begin()       end() 

對於你想實現什麼,看看在std::adjacent_find

auto it = std::adjacent_find(v.begin(), v.end()); 

if (it != v.end()) 
{ 
    count ++; 
} 
else 
{ 
    cout << *it << " ---- " << count << endl; 
} 
0

因爲當it接近年底,it+1是在結束了,你想取消對它的引用在if運算符。

1

當你在最後一個字,並嘗試執行:

if (*it == *(it+1))

it+1指向在v.end(),這是一個有效的迭代器,而不是derefernceable。因此錯誤。

1

當它是一個結束迭代器之前,你有一個問題在這裏:*(it+1)因爲這試圖解引用結束迭代器,這是無效的。

我不確定你希望你的邏輯在這種情況下做什麼,但你可以在做你的東西之前用if (it+1 != v.end())進行檢查。

1

it == v.end() - 1,你尊重(it+1)所以v.end(), 和尊重v.end()是不確定的行爲。