std::multimap上的template_hint是否保留了等价元素的相对顺序



根据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标准和当前标准中都出现了相同的措辞,因此该措辞最近没有任何变化。

相关内容

  • 没有找到相关文章

最新更新