std::multimap::find 将返回哪个元素,类似地 std::multiset::find?

Posted

技术标签:

【中文标题】std::multimap::find 将返回哪个元素,类似地 std::multiset::find?【英文标题】:which element will be returned from std::multimap::find, and similarly std::multiset::find? 【发布时间】:2014-02-02 10:02:38 【问题描述】:

这个问题很可能是重复的,但我找不到对它的引用。

我正在查看std::multiset::find 和std::multimap::find 函数,我想知道如果多次插入特定键会返回哪个元素?

来自描述:

请注意,此函数返回一个指向单个元素的迭代器( 可能的多个等效元素)

问题

是否保证单个元素第一个插入的还是随机的?

背景

我问的原因是我正在实现类似于类的 multipmap:

typedef std::vector<Item> Item_vector;

class Item

  string m_name;
;

class MyItemMultiMap

public:
   
  // forgive me for not checking if key exist in the map. it is just an example.

  void add_item( const Item& v )  m_map[v.m_name].push_back(v); 
  
  // is returning the first item in the vector mimic std::multimap::find behavior?
  Item& get_item( const string& v )  return m_map[v][0];  

private:
  std::map<string,Item_vector> m_map;
;

我希望 get_item()std::multimap::find 一样工作。可能吗?如果有,如何实施?

【问题讨论】:

【参考方案1】:

如果存在多个,find 方法可能会返回任意一个,尽管您的 STL 实现可能确实只给出第一个。

使用 'lower_bound' 方法更安全,并 ++ 从那里迭代(参见 std::multimap::lower_bound)。请注意,如果您要查找的内容不存在,“lower_bound”会返回对另一个元素的引用!

【讨论】:

【参考方案2】:

C++ 标准规定,对于任何关联容器 aa.find(k)“返回一个迭代器,该迭代器指向一个元素,其键等效于 k,如果找不到这样的元素,则返回 a.end()”,以及它不会对multimap 施加任何额外的要求。由于它没有指定返回哪个元素,因此允许实现返回任何匹配的元素。

如果您试图在您运行的平台上模仿 multimap 的确切行为,那是个坏消息,但如果您的目标只是满足与 multimap 相同的要求,那么这是个好消息:你可以返回任何你想要的匹配元素,特别是总是返回第一个是很好的。

【讨论】:

【参考方案3】:

http://en.cppreference.com/w/cpp/container/multimap/find

使用键 key 查找元素。如果有几个元素带有 key 在容器中,选择了之前插入的那个。

因此,将返回第一个元素的迭代器。

总的来说,我发现 equal_range 是更有用的方法,它返回一对迭代器,分别指向第一个和最后一个与键匹配的元素。

【讨论】:

我在 C++ 标准中找不到任何东西来支持 cppreference.com 的报价。 确实,标准(C++11 表 102)仅指定它“返回一个迭代器,该迭代器指向一个元素,其键等效于 [the key]”,没有说明如果有一个选择。 cppreference 已更正,感谢 @juanchopanza 在那里的谈话页面上提出它。 在 C++98 中,不能保证等效键保持插入顺序。然而,C++11 确实保证了这一点。然而 find() 仍然不能保证它找到哪一个 引用的参考是Finds an element with key equivalent to key. If there are several elements with key in the container, any of them may be returned。这里的关键词是any

以上是关于std::multimap::find 将返回哪个元素,类似地 std::multiset::find?的主要内容,如果未能解决你的问题,请参考以下文章

C语言函数返回1和返回0究竟哪个好?

C语言函数执行成功时,返回1和返回0,究竟哪个好?

调用 func 会返回哪个值

C语言函数执行成功时,返回1和返回0,究竟哪个好?

C语言学习笔记C语言函数执行成功时,返回1和返回0,究竟哪个好?

当出现错误时,我们是不是应该强调返回哪个特定的 HTTP 响应代码?