2

我通过以下方式使用擦除从地图中删除元素,但它无法正常工作。为什么?它不是全部删除。

float nw_cut=80.0;
for(it=nw_tot1.begin();it!=nw_tot1.end();it++)
{
    float f=(float) ((float) it->second/lines)*100.0;
    if ( f < nw_cut )
    {
        nw_tot1.erase(it);
    }
}
4

3 回答 3

7

来自std::map::erase()

对已擦除元素的引用和迭代器无效。其他引用和迭代器不受影响。

Iferase(it)被调用 thenit无效,然后for循环使用它导致未定义的行为。存储 的返回值erase(),它将一个迭代器返回到被擦除元素之后的下一个元素(自 c++11 起),并且仅erase()在未调用时递增:

for(it = nw_tot1.begin(); it != nw_tot1.end();)
{
    float f=(float) ((float) it->second/lines)*100.0;

    if ( f < nw_cut ) it = nw_tot1.erase(it);
    else ++it;
}

在 c++03(以及 c++11)中,这可以通过以下方式完成:

for(it = nw_tot1.begin(); it != nw_tot1.end();)
{
    float f=(float) ((float) it->second/lines)*100.0;

    if ( f < nw_cut ) nw_tot1.erase(it++);
    else ++it;
}
于 2013-06-25T11:08:51.830 回答
1

你应该这样做:

float nw_cut=80.0;
for(it=nw_tot1.begin();it!=nw_tot1.end();)
{
    float f=(float) ((float) it->second/lines)*100.0;
    it_temp = it;    //store it in temp variable because reference is invalidated when you use it in erase.
    ++it;
    if ( f < nw_cut ) {
        nw_tot1.erase(it_temp);
    }
}
于 2013-06-25T11:10:12.603 回答
0
for(it = nw_tot1.begin(); it != nw_tot1.end();)
{
    float f=(float) ((float) it->second/lines)*100.0;

    if ( f < nw_cut ) it = nw_tot1.erase(it);
    else ++it;
}
于 2013-06-25T12:02:02.537 回答