从C++映射中删除键

Ste*_*ris 45 c++ map

我想从STL地图中删除一个密钥.但是, map.erase()什么都不做.我该怎么做呢

pax*_*blo 73

这完全取决于你如何调用它,但听起来你可能正在使用该first,last选项.如果你是,你需要记住,它擦除元素开始first,直到但排除 last.如果遵循该规则,基于迭代器的删除应该可以作为单个元素或范围正常工作.

如果你按键擦除,那么它也应该有效,假设键当然在那里.

以下示例代码显示了所有三种方法:

#include <iostream>
#include <map>

int main (void) {
    std::map<char,char> mymap;
    std::map<char,char>::iterator it;

    mymap['a'] = 'A'; mymap['b'] = 'B'; mymap['c'] = 'C';
    mymap['d'] = 'D'; mymap['e'] = 'E'; mymap['f'] = 'F';
    mymap['g'] = 'G'; mymap['h'] = 'H'; mymap['i'] = 'I';

    it = mymap.find ('b');             // by iterator (b), leaves acdefghi.
    mymap.erase (it);

    it = mymap.find ('e');             // by range (e-i), leaves acd.
    mymap.erase (it, mymap.end());

    mymap.erase ('a');                 // by key (a), leaves cd.

    mymap.erase ('z');                 // invalid key (none), leaves cd.

    for (it = mymap.begin(); it != mymap.end(); it++)
        std::cout << (*it).first << " => " << (*it).second << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

哪个输出:

c => C
d => D
Run Code Online (Sandbox Code Playgroud)


bob*_*obo 9

你将不得不找到迭代器第一

map.erase( ITERATOR ) ;
Run Code Online (Sandbox Code Playgroud)

为了确保安全,您需要确保ITERATOR存在.例子:

#include <stdio.h>
#include <map>
using namespace std ;

int main()
{
  map<int,int> m ;
  m.insert( make_pair( 1,1 ) ) ;
  map<int,int>::iterator iter = m.find(1) ;
  if( iter != m.end() )
    m.erase( iter );
  else puts( "not found" ) ;

}
Run Code Online (Sandbox Code Playgroud)