我正在尝试将相同的键多次插入到地图中但具有不同的值。它不起作用。我知道operator []做了这个工作,但我的问题是,如果插入的这种行为是正确的吗?不应该插入()插入?我不知道标准是什么。不幸的是我没有它(C ++标准)所以我无法检查。
感谢您提供有用的ansers。
答案 0 :(得分:14)
如果要插入具有不同值的相同密钥,则需要std::multimap
。
如果密钥已存在,std::map::insert
将不会执行任何操作。
std::map::operator[]
将覆盖旧值。
对于STL参考,你不需要C ++标准本身;像http://www.cplusplus.com/reference/之类的东西也会这样做。
答案 1 :(得分:5)
我不确定我完全理解,但听起来你在覆盖地图上的先前条目; map
仅为每个密钥存储一个值。
相反,您需要使用multi_map
。这将允许您插入具有不同值的相同键。你确实以这种方式失去了operator[]
,因为它不会有意义。 (当插入时,确定,但该操作符也会检索。它应该检索哪个值?)
以下是一个示例(从here修改):
#include <iostream>
#include <map>
int main(void)
{
std::multimap<std::string, int> m;
m.insert(std::make_pair("a", 1));
m.insert(std::make_pair("b", 2));
m.insert(std::make_pair("c", 3));
m.insert(std::make_pair("a", 4));
m.insert(std::make_pair("b", 5));
m.insert(std::make_pair("a", 6));
std::cout << "Number of elements with key a: " << m.count("a") << endl;
std::cout << "Number of elements with key b: " << m.count("b") << endl;
std::cout << "Number of elements with key c: " << m.count("c") << endl;
std::cout << "Elements in m: " << endl;
for (m::iterator it = m.begin(); it != m.end(); ++it)
{
std::cout << " [" << it->first << ", " << it->second << "]" << endl;
}
}