编辑: 请注意,我不是在问为什么multimap不能包含重复键.
允许重复键值对的multimap背后的基本原理是什么?(不是钥匙)
#include <map>
#include <string>
#include <iostream>
int
main(int argc, char** argv)
{
std::multimap<std::string, std::string> m;
m.insert(std::make_pair("A", "B"));
m.insert(std::make_pair("A", "B"));
m.insert(std::make_pair("A", "C"));
std::cout << m.size() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这打印3,有点让我感到惊讶,我期望multimap表现得像一对对,所以我期待2.
直观地说,它与C++ std::map行为不一致,insert它并不总是改变地图(而不是operator[]).
它背后有理由,还是随意的?
我有一个multimap,我想让它中的所有唯一键存储在一个向量中.
multimap<char,int> mymm;
multimap<char,int>::iterator it;
char c;
mymm.insert(pair<char,int>('x',50));
mymm.insert(pair<char,int>('y',100));
mymm.insert(pair<char,int>('y',150));
mymm.insert(pair<char,int>('y',200));
mymm.insert(pair<char,int>('z',250));
mymm.insert(pair<char,int>('z',300));
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?有方法可以使用键计算元素数,但不计算多图中唯一键的数量.
补充:通过唯一我指的是multimap中的所有键一次 - 它们可以在multimap中重复或出现一次.
所以这里的唯一键是-x,y和z
我有一些带有整数索引的数据.我不断生成需要添加到我拥有的数据集合中的新数据,按索引排序,同时我希望能够轻松地开始数据并迭代它.这听起来像std :: multimap正是我需要的.
但是,我还需要按照插入顺序保存具有相同索引的数据,在这种情况下,这意味着当我遍历数据时,我会在之后的数据之前得到早期数据.
multimap会这样做吗?
我没有找到任何保证,这是这种情况.在sgi手册中,我没有看到是否提及.我在gcc 4.3.4实现上尝试了它,对于一些有限的测试用例似乎是正确的,但当然我想知道标准是否要求这个并且我可以依赖这个事实.
编辑:为了更清楚地回答一些答案,我希望数据首先按(非唯一)索引排序,然后按插入时间排序.我原本希望第二部分可以免费使用multimap,但似乎没有.
我需要为一个带有空集合的Guava Multimap添加一个键作为值.我该如何做到这一点?
我试过这个:
map.put( "my key", null );
Run Code Online (Sandbox Code Playgroud)
但是调用get()会返回一个包含一个元素的列表,该列表为null.我通过以下方式解决了这个问题:
map.putAll("my key2", new ArrayList())
Run Code Online (Sandbox Code Playgroud)
但我想知道这是不是一件坏事吗?我知道当删除最后一个值时,Guava会自动删除一个键以保持containsKey()的一致性.我最好的选择是什么?
问题的第一部分是我正在尝试使用boost :: bimap,但是从文档中我不清楚如何定义双向多图.
问题的第二部分是我需要它是一个方向的地图和另一个方向的多个地图,这可以使用boost :: bimap来完成吗?
有没有人经历过这个或者能指出我正确的页面?
我想知道哪个更有效率.
std::map< String, std::set<int> >
Run Code Online (Sandbox Code Playgroud)
要么
std::multimap< String, int >
Run Code Online (Sandbox Code Playgroud)
编辑: 我不打算用这些地图做任何与众不同的事情.标准插入,删除,修改,搜索.每个集合或多键字符串的大小不应超过100.
很可能这个问题是重复的,但我找不到它的引用.
我正在查看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 …Run Code Online (Sandbox Code Playgroud) 将两个地图组合成Java中的单个Guava MultiMap的最佳方法是什么?
例如:
然后生成的组合多图将包含
这是我目前的解决方案:
Multimap<T, K> combineMaps(Map<T, K> map1, Map<T, K> map2) {
Multimap<T, K> multimap = new MultiMap();
for (final Map.Entry<T, K> entry : map1.entrySet()) {
multimap.put(entry.getKey(), entry.getValue());
}
for (final Map.Entry<T, K> entry : map2.entrySet()) {
multimap.put(entry.getKey(), entry.getValue());
}
return multimap;
}
Run Code Online (Sandbox Code Playgroud) 是否有可用的番石榴Cache和Multimap功能组合?基本上,我需要一个集合,其中条目在给定时间后过期,例如可用Cache但我有非唯一键,我需要条目独立到期.
我想在C++中设置一个多图:
multimap<pair<string, string>, vector<double> > mmList;
Run Code Online (Sandbox Code Playgroud)
但是如何插入数据:
mmList.insert(pair<string, string>, vector<double>("a", "b", test));
Run Code Online (Sandbox Code Playgroud)