16

这个问题很可能是重复的,但我找不到它的参考。

我正在查看std::multiset::findstd::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. 可能吗?如果是这样,它将如何实施?

4

3 回答 3

9

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

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

于 2014-01-14T11:09:42.197 回答
4

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

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

于 2014-01-14T16:39:46.943 回答
-2

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

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

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

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

于 2014-01-14T11:09:35.570 回答