如何解决向量迭代器不递增?
我正在尝试解决问题,我不确定该解决方案是否正确,但是我遇到了错误消息:“向量迭代器不可递增”。有人可以帮忙吗?plz
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main ()
{
int operations_n,x=0;
string my_string;
vector <char>my_vector;
cin>>operations_n;
cin>>my_string; //error appears after giving a value for the string
for(int i=0;i<my_string.length();++i)
{
my_vector.push_back(my_string[i]);
}
for(int i=0;i<my_string.length()/3;++i)
{
string m1="";
for(vector <char>::iterator it=my_vector.begin();it<(my_vector.begin()+3);++it)
{
m1+=my_vector.front();
my_vector.erase(my_vector.begin());
}
if(m1=="++x" || m1=="x++")
++x;
else if(m1=="--x" || m1=="x--")
--x;
}
cout<<x<<endl;
return 0;
}
解决方法
for(vector <char>::iterator it=my_vector.begin();it<(my_vector.begin()+3);++it)
您使用it
来迭代my_vector
的前三个元素。
{
m1+=my_vector.front();
my_vector.erase(my_vector.begin());
}
您刚刚删除了my_vector
中的第一个元素。
此操作是documented引用,“使在擦除点或擦除点之后的迭代器和引用无效,包括end()迭代器”。。
这包括it
,这是擦除点处的迭代器 。但是,您将继续使用不再有效的迭代器进行循环。那是在调用未定义的行为。
然后,您的循环仍然有问题(如@drescherjm所指出的那样),但是此时您已经离开了定义良好的代码领域。
尽管如此,我还是觉得很好奇:
for(int i=0;i<my_string.length();++i)
{
my_vector.push_back(my_string[i]);
}
请注意,string
是,对于大多数实用目的,是vector
的一种特殊形式。例如,它具有自己的erase
函数。而且即使确实需要将字符复制到vector
中,也有比按字符复制更有效的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。