添加更多数据后,C ++ Vector迭代器无法解除引用

时间:2012-02-05 04:43:26

标签: c++ vector iterator

同志,

以下不起作用:

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个单词,它就会停止工作,并且会给我“#34;而不是可解除错误的错误&#34;。

我试过这个,结果相同:

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++;}
}

我一直试图解决这个问题几天,我是初学者。

3 个答案:

答案 0 :(得分:1)

想象一下你的矢量只包含一个字符串,“介词”。

现在你的执行就是这样:

  1. 开始迭代,迭代器指向第一个向量元素
  2. 将解除引用的迭代器与“介词”
  3. 进行比较
  4. 匹配!
  5. 增加迭代器。迭代器现在等于holdtype.end()
  6. 尝试取消引用迭代器以将其与“未知”进行比较(代码:*c == "unknown"
  7. 失败,因为您无法获得std::vector::end()特殊值的“内容”。
  8. 在第一段代码中,您有效地尝试访问向量末尾之外的元素。在第二个中,所有c != holdtype.end()个检查都成功地防范了这一点。

答案 1 :(得分: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;
}

答案 2 :(得分:1)

在这两种情况下,您都可能取消引用结束迭代器。假设你的向量以“介词”结尾。

在第一个示例中,您根本无法保护end()。所以,当你点击最后一个“介词”时,你将要取消引用。

在第二个例子中,你的保护是倒退的。您需要在递增后测试迭代器是否在最后,而不是之前。