为unordered_map赋值的基本问题

Les*_*lie 10 c++

我有一个unordered_map,它将int作为键存储为指针作为值.我需要检查密钥的存在.如果密钥不可用,我需要插入密钥和值.哪一个更好的方法?

谢谢.

unordered_map<int, classA*>testMap;
classA* ptr = testMap[1];
if(ptr == NULL)
   testMap[1] = new classA;


OR

unordered_map<int, classA*>::iterator it = testMap.find(1);
if(it == testMap.end())
{
  testMap.insert(make_pair(1, new classA));
}
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 6

这两种方法都不是很好,因为它们都会在地图中使用两个查询,其中一个就足够了.

一个更好的方法是检索对元素的引用,如果该引用是空指针,则赋值给它:

classA*& ptr = testMap[1];
if (ptr == 0)
    ptr = new classA;
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为在地图中查询不存在的元素会自动插入它(默认构造,因此将插入空指针),并operator[]返回对该元素的引用(无论是新创建的还是已存在的).

但请注意,此方法(或您的第一个方法)与第二个方法之间的语义略有不同:如果映射中不存在键,则第二种方法仅插入元素.如果密钥实际上已经存在,我的方法(和你的第一个方法)也会创建一个新元素,但它的值是一个空指针.

  • 如果该密钥已经存在并且"NULL"是它的有效值怎么办? (4认同)