同志,
以下不起作用:
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++;}
}
我一直试图解决这个问题几天,我是初学者。
答案 0 :(得分:1)
想象一下你的矢量只包含一个字符串,“介词”。
现在你的执行就是这样:
holdtype.end()
。*c == "unknown"
)std::vector::end()
特殊值的“内容”。在第一段代码中,您有效地尝试访问向量末尾之外的元素。在第二个中,所有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()
。所以,当你点击最后一个“介词”时,你将要取消引用。
在第二个例子中,你的保护是倒退的。您需要在递增后测试迭代器是否在最后,而不是之前。