根据http://www.cplusplus.com/reference/map/multimap/emplace_hint/
等价元素的相对顺序被保留,新插入的元素遵循容器中已经存在的等价元素。
位置中的值用作插入点上的提示。然而,元素将按照其内部比较对象所描述的顺序插入到其相应的位置,但该提示被函数用来开始搜索插入点,当实际插入点位于或靠近它时,大大加快了过程
据我所知,提示只是一个提示,根本不应该影响排序。但clang++(11(和g++(10(似乎都不是这样,无论是选项还是指定的标准c++。
int main()
{
std::multimap<int, string> mymap;
// emplace
mymap.emplace(0, "First");
mymap.emplace(0, "Second");
// emplace_hint
mymap.emplace_hint(mymap.end(), 1, "First");
// Insert with the previously inserted element as hint
mymap.emplace_hint(--mymap.end(), 1, "Second");
for (auto it = mymap.begin(); it != mymap.end(); ++it) {
std::cout << it->first << " " << it->second << std::endl;
}
return 0;
}
输出
0 First
0 Second
1 Second
1 First
这是预期的行为吗?
来自cplusplus.com的引用似乎有错误。来自C++标准:
22.2.6关联容器〔Associative.reqmts〕
如果关联容器可能包含每个键最多一个元素。否则,它支持等效密钥。集合类和映射类支持唯一键;multiset与multimap类支持等价的键。对于multiset和multimap,插入,模板和擦除保留等价物的相对顺序元素。
请注意,只列出了emplace
,而没有列出emplace_hint
。
C++11标准和当前标准中都出现了相同的措辞,因此该措辞最近没有任何变化。