【问题标题】:map .erase doesn't delete the elementmap .erase 不会删除元素
【发布时间】:2018-08-19 01:01:02
【问题描述】:

根据以下代码擦除元素的最佳方法是什么?在我可以擦除找到的最大数字之前,需要完成内部 for 循环。虽然“problem-with-stdmapiterator-after-calling-erase”解释了擦除的工作原理,但我似乎无法使其工作。基于以下代码的示例将不胜感激。

map<string,int> test;
void sort_print()
{
    int biggestNum = 0;
    string word;

    for(int i = 0; i < WORDS_TO_FIND; i++)
    {
        for(auto it = test.begin(); it != test.end(); ++it )
        {
            if (it->second > biggestNum)
            {
                biggestNum = it->second;
                word = it->first;
            }

        }
        test.erase(word);
        cout << word + ": " << biggestNum << endl;
    }
}

有趣的是,当我转到 main 时(在从上面的函数中删除第一个循环并执行以下操作之后......然后它可以工作,但为什么?:

for(int i = 0; i < WORDS_TO_FIND; i++)
{
    test.erase(sort_print());
}

【问题讨论】:

标签: c++


【解决方案1】:

如果您只想擦除值最高的地图元素,那么:

map<string, int> test;

void sort_print()
{
    int biggestNum = 0;
    string word;

    for (auto it = test.begin(); it != test.end(); it++)
    {
        if (it->second > biggestNum)
        {
            word = it->first;
        }
    }
    cout << word + ": " << biggestNum << endl;
    test.erase(word);
}

不需要两个循环,也不需要:

biggestNum = it->second;

【讨论】:

  • 谢谢,但我担心这似乎并没有在尝试后删除元素。因此,当它再次进入外部for循环时,它会打印与上次相同的结果。另外,请注意,当我们正在寻找最大的数字时,应该在内部循环完成时调用擦除。
  • 再次感谢您,我需要它来获得 X 数量的单词,并且订购的数量最大。所以每次我找到最大的单词(基于它的 int 值)我都会删除它并再次循环。根据您上面的示例(在您对其进行编辑之后),我已经尝试过了,但它仍然没有删除足够有趣的元素......但是根据我的上述解释,我仍然需要第二个循环。
  • @George 我不明白你的意思是它不会删除它。 map::erase 确实会在您给它的迭代器处擦除元素。例如,如果您想删除地图中前五个最高的数字,请调用该函数五次。如果您想在一个函数调用中专门完成它,请告诉我。
  • 外部循环,将循环20次,以便它可以找到地图中具有最大整数值的单词。当内部循环完成时,我想擦除该值,以便在第二次执行时不会找到相同的单词。调用 test.erase(word) 不会删除该值,因此我得到了 20 次相同的结果。话虽如此,删除外部循环(循环 20 次)并将其移动到 main 并从那里调用擦除,然后它按预期删除值,我得到正确的结果。为什么会这样?
  • 我知道这很愚蠢...忘记重置计数器最大数。谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多