map的erase函数小结

关于map关联容器的删除c++ primer只是一笔带过,实际上不了解去使用还是有点问题,比如所以for去遍历删除指定条件的节点就有坑;索性去c++官网看例子,链接如下

http://www.cplusplus.com/reference/map/map/erase/

https://en.cppreference.com/w/cpp/container/map/erase

    std::map<char, int> mymap;
    std::map<char, int>::iterator it;

    // insert some values:
    mymap['a'] = 10;
    mymap['b'] = 20;
    mymap['c'] = 30;
    mymap['d'] = 40;
    mymap['e'] = 50;
    mymap['f'] = 60;

    it = mymap.find('b');
    it= mymap.erase(it);                   // erasing by iterator

    mymap.erase('c');                  // erasing by key

    it = mymap.find('e');
    auto it2 = mymap.find('f');
    it2 = mymap.erase(it, it2);    // erasing by range

    // show content:
    for (it = mymap.begin(); it != mymap.end(); ++it)
        std::cout << it->first << " => " << it->second << '
';
//写一个测试的遍历删除例子
   	for (auto it = mymap.begin(); it != mymap.end();)
	{
		if (it->second == 20)
		{
			it = mymap.erase(it);
		}
		else
		{
			++it;
		}
	}
//ps:一般而言循环遍历然后删除可能并不合适,在这种情况下,可以使用一个vector或者别的容器先保存要删除的迭代器节点,需要删除时再提出删除

总结:

map的删除函数有三种形式,1.删除给定iterator指定的那个位置;2.删除[first,last)迭代器区间的所有节点(记得是前闭后开区间),3.删除给定key的节点

1和2的返回值是指向被删除元素的下一个元素的迭代器(所以如果是区间删除是指向last,呵呵),3返回的是删除元素的个数

原文地址:https://www.cnblogs.com/Cxiangyang/p/13788127.html