1

考虑以下代码片段:

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

如果我运行此代码,程序会崩溃,崩溃的原因是 iterator 的第二个增量it。为什么会这样?迭代器需要递增,我将它递增两次而不是一次!它出什么问题了?

如果我想将两个相邻的地图项值保存到其他地图中,就像我在上面的 for 语句中所做的那样,我应该怎么做?如果我想将每 3 个其他项目组合并存储在一起怎么办?

我需要分别更新迭代器才能继续,但我不知道该怎么做。

4

3 回答 3

2

当您到达 时,您将循环设置为结束container.end,但是因为您将迭代器增加了两次,您到达了末尾,然后在第二个 it++ 中您尝试更进一步(错误)。

示例:假设您有 3 个元素。

it = container.begin()

++it // ok
++it //ok

it != container.end() //true

++it // ok BUT AT THIS MOMENT it = container.end !
++it // CRASH
于 2013-07-21T12:35:14.483 回答
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!
    }
}
于 2013-07-21T12:40:56.643 回答
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

于 2013-07-21T14:51:18.660 回答