这个问题很可能是重复的,但我找不到它的引用。
我在看std::multiset::find& std::multimap::find函数,我想知道如果多次插入特定键,将返回哪个元素?
来自说明:
请注意,此函数将迭代器返回到单个元素(of 可能是多个等价元素)
是否保证 单个元素 是插入的第一个,还是随机的?
我问的原因是我正在实现像类这样的多重映射:
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
一样工作。可能吗?如果是这样,它将如何实施?
答案 0 :(得分:9)
如果存在多个,则find方法可以返回任意一个,尽管您的STL实现可能确实只是给出了第一个。
使用'lower_bound'方法更安全,++从那里迭代(参见std::multimap::lower_bound)。请注意,如果您要查找的内容不存在,'lower_bound'会将ref返回给另一个元素!
答案 1 :(得分:3)
C ++标准规定,对于任何关联容器a
,a.find(k)
“返回指向具有等效于k
的键的元素的迭代器,或a.end()
找不到元素“,它不会对multimap
施加任何额外要求。由于它没有指定返回哪个元素,因此允许实现返回任何匹配的元素。
如果您试图模仿multimap
在您运行的平台上的确切行为,这是个坏消息,但如果您的目标是满足与multimap
相同的要求,这是个好消息:你可以返回你想要的任何匹配元素,特别是总是可以返回第一个元素。
答案 2 :(得分:2)
http://en.cppreference.com/w/cpp/container/multimap/find
使用键键查找元素。如果有几个带键的元素 在容器中,选择先前插入的容器。
因此,将返回第一个元素的迭代器。
一般来说,我发现equal_range是更有用的方法,返回一对迭代器分别指向第一个,最后一个指向匹配键的元素。