问题 哪个元素将从std :: multimap :: find返回?


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

我在看 性病:: multiset的::找 & 的std ::多重映射::找 函数和我想知道如果多次插入特定键,将返回哪个元素?

从描述:

请注意,此函数将迭代器返回到单个元素(   可能是多个等价元素)

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

背景

我问的原因是我正在实现像类这样的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。可能吗?如果是这样,它将如何实施?


2613
2018-01-14 11:04


起源



答案:


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

使用'lower_bound'方法更安全,++从那里迭代(参见 的std ::多重映射:: LOWER_BOUND)。请注意,如果您要查找的内容不存在,'lower_bound'会将ref返回给另一个元素!


9
2018-01-14 11:09





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

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


3
2018-01-14 16:39





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

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

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

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


2
2018-01-14 11:09



我在C ++标准中找不到任何支持cppreference.com引用的内容。 - juanchopanza
实际上,标准(C ++ 11表102)仅指定它“返回指向具有等同于[key]的键的元素的迭代器”,如果有选择则没有指示哪一个。 - Mike Seymour
cppreference已经更正了,感谢@juanchopanza将其提交到Talk页面。 - Cubbi
在C ++ 98中,无法保证等效键保持插入顺序。但是C ++ 11确实保证了这一点。但是find()仍然无法保证它找到了哪一个 - CashCow


答案:


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

使用'lower_bound'方法更安全,++从那里迭代(参见 的std ::多重映射:: LOWER_BOUND)。请注意,如果您要查找的内容不存在,'lower_bound'会将ref返回给另一个元素!


9
2018-01-14 11:09





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

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


3
2018-01-14 16:39





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

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

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

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


2
2018-01-14 11:09



我在C ++标准中找不到任何支持cppreference.com引用的内容。 - juanchopanza
实际上,标准(C ++ 11表102)仅指定它“返回指向具有等同于[key]的键的元素的迭代器”,如果有选择则没有指示哪一个。 - Mike Seymour
cppreference已经更正了,感谢@juanchopanza将其提交到Talk页面。 - Cubbi
在C ++ 98中,无法保证等效键保持插入顺序。但是C ++ 11确实保证了这一点。但是find()仍然无法保证它找到了哪一个 - CashCow