2012-02-05 73 views
0

同志們,C++矢量迭代後,更多的數據並不dereferencable添加

下不起作用:

vector<string>::iterator c; 

for(c = holdtype.begin(); c != holdtype.end(); c++) 
{ 
    if(*c == "preposition") 
    { 
     c++; 
     if(*c == "unknown") 
     {  
      c++; 
      if(*c == "unknown") 
      { 
       c++; 
       if(*c == "unknown") 
       { 
        cout <<endl <<"This should be a verb " << *c; 
       } 
      } 
     } 
    } 
} 

奇怪的是,它適用於一定量的數據。一旦它超過大約30字,它就停止工作,並給我「不可忽視的錯誤」。

我已經嘗試這樣做,它提供了相同的結果:

vector<string>::iterator c; 
c = holdtype.begin(); 

while(c != holdtype.end()) 
{ 
    if(*c == "preposition") 
    { 
     if(c != holdtype.end()) { c++; } else { break; } 
     if(*c == "unknown") 
     {  
      if(c != holdtype.end()) { c++; } else { break; } 
      if(*c == "unknown") 
      { 
       if(c != holdtype.end()) { c++; } else { break; } 
       if(*c == "unknown") 
       { 
        cout <<endl <<"This should be a verb " << *c; 
       } 
      } 
     } 
    } 
    if(c == holdtype.end()) { break; } else {c++;} 
} 

我一直在努力,現在摸不着頭腦了幾天,我是一個初學者。

+0

你想用這段代碼實現什麼? – Johnsyweb 2012-02-05 04:47:35

+1

所以,讓我們說c == holdtype.end()-1,然後你增加它,然後你就會遵從它。你增加後不檢查。 – 2012-02-05 04:49:17

回答

1

你的第二個版本是幾乎是正確的,但你需要檢查,如果c是有效的,你增加後,你之前解引用:

vector<string>::iterator c; 
c = holdtype.begin(); 

while(c != holdtype.end()) 
{ 
    if(*c == "preposition") 
    { 
     ++c; 
     if(c == holdtype.end()) { break; } 
     if(*c == "unknown") 
     {  
      ++c; 
      if(c == holdtype.end()) { break; } 
      if(*c == "unknown") 
      { 
       ++c; 
       if(c == holdtype.end()) { break; } 
       if(*c == "unknown") 
       { 
        cout <<endl <<"This should be a verb " << *c; 
       } 
      } 
     } 
    } 
    ++c; 
} 
+0

謝謝!我很愚蠢! – VSB 2012-02-05 05:29:06

1

想象一下,你的向量只包含一個字符串,「介詞」。

現在你的執行做到這一點:

  1. 開始迭代,迭代器指向第一向量元素
  2. 比較iterator的反引用到 「介詞」
  3. 的比賽!
  4. 遞增迭代器。迭代器現在等於holdtype.end()
  5. 嘗試解引用迭代器將其比作「未知」(代碼:*c == "unknown"
  6. 失敗,因爲你不能得到的std::vector::end()特殊價值的「內容」。

在第一段代碼中,您正在有效地嘗試訪問超出矢量末尾的元素。第二,所有的c != holdtype.end()檢查成功防範這一點。

+1

'c!= holdtype.end()'不能防範問題。假設'c'是'end()'之前的一個。 'c'不是'end()',所以'if'語句調用then分支,'{C++}'。下一條指令解除引用,所以kaboom。 – 2012-02-05 05:04:10

+0

@DavidHammen你說得對。該檢查可能應該是'if(++ c == holdtype.end()){break; }'。 – Borealid 2012-02-05 05:05:15

+0

@Borealid感謝您的幫助! – VSB 2012-02-05 05:31:55

1

您可能取消引用結束迭代器在兩種情況下。假設你的向量以「介詞」結尾。

在第一個示例中,您完全沒有保護,以抵禦end()。所以,當你擊中最後一個「介詞」時,你將取消引用。

在第二個示例中,您是保護倒退。您需要測試迭代器是否在增量後結束,而不是之前。

+0

感謝您的解釋! – VSB 2012-02-05 05:30:04