考虑以下代码片段:
map<wstring,int>::iterator it;
map<wstring,int> bimap;
//Creating Bigrams out of monograms
for (it= container.begin(); it != container.end();)
{
bimap[it->first + L" "+((++it)->first)]++;
++it;
++it;
}
如果我运行此代码,程序崩溃,崩溃的原因是迭代器it
的第二个增量。为什么会这样?迭代器需要递增,我将它递增两次而不是一次!怎么了?
如果我想将两个相邻的地图项目值保存到其他地图中,就像我在上面的for语句中实际做的那样,我应该怎么做呢?如果我想将每3个其他项目组合在一起怎么办?
我需要分别更新迭代器,但我不知道该怎么做。
答案 0 :(得分:2)
当你到达container.end
时,你将你的循环设置为结束,但是因为你将迭代器增加两次你到达终点,然后用那一秒你++尝试更进一步(错误)。
示例:假设您有3个元素。
it = container.begin()
++it // ok
++it //ok
it != container.end() //true
++it // ok BUT AT THIS MOMENT it = container.end !
++it // CRASH
答案 1 :(得分:1)
你要多次递增迭代器
for (it= container.begin(); it != container.end();)
{
bimap[it->first + L" "+((++it)->first)]++; //increment!
++it; //increment!
++it; //increment!
}
所以你晚上在最后一个元素,进入循环,因为满足it != container.end()
条件然后超出界限。
如果你知道你总是会做2个增量,但如果只剩下一个元素就结束,那么你可能会考虑这个:
for (it= container.begin(); it != container.end();)
{
//do something
++it; //increment!
if(it!=container.end()){ //check again. can we move forward?
//do something
++it; //increment!
}
}
答案 2 :(得分:1)
在每次迭代时只增加一次,并使用一个辅助计数器模3(在每3次迭代后重置它),并在每次为0时执行您想要执行的任务:
int counter_mod3;
for (it= container.begin(); it != container.end();)
{
if(counter_mod3 == 0) // This zero chooses the phase on which the "sampling" is to be made
bimap[it->first + L" "+(it->first)]++; //increment!
++it; //increment!
counter_mod3 = (counter_mod3++) % 3;
}
如果你想从其他元素开始,而不是第一个,只需将阶段改为1或2