我怎么知道std :: map insert是成功还是失败?

Mat*_*att 7 c++ linux gcc stl

我在一个多线程应用程序中有一个映射,将一个名为uuid的类映射到指针.如果插入操作成功失败,我想知道什么.

例如

_mymap.insert(hint, MyMap::value_type(entry.uuid, itemptr));
Run Code Online (Sandbox Code Playgroud)

如果失败会引发异常吗?

Arm*_*yan 15

事实上,采用提示参数的insert方法不会返回插入是否成功.检查插入是否实际发生的一种方法是在插入之前和之后检查地图的大小.如果它是相同的,则插入失败(即密钥已经存在).我知道这听起来很难看,但这是我能想到的最有效的方式.事实上,我认为没有令人信服的理由,带有提示的插入不应该返回一对(包括bool),就像常规的非提示插入一样.但是,一旦在旧标准中指定它,就很难改变,因为它是一个突破性的变化,C++社区大多都不满.

原(错)答案

看到这个链接

...返回一对,其成员pair::first设置为迭代器,指向新插入的元素或指向已在地图中具有相同值的元素.pair::second如果插入了新元素,则该对中的元素设置为true;如果存在具有相同值的元素,则该元素设置为false.

该链接还包含一个示例

例如:

if(mp.insert(make_pair(key, value)).second == false)
{
   cout << "Insertion failed. Key was present"
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这是不正确的.带有提示参数的insert()方法不返回一对,而只返回一个迭代器. (10认同)

Tri*_*ner 8

typedef std::map<std::string, int> map;
map m;
std::pair<map::iterator,bool> result = m.insert(std::make_pair("hi", 42));
Run Code Online (Sandbox Code Playgroud)

result.second包含你想要的东西