为什么从std :: map插入不想更新? [C ++]

时间:2010-01-08 11:01:50

标签: c++ map

我正在尝试将相同的键多次插入到地图中但具有不同的值。它不起作用。我知道operator []做了这个工作,但我的问题是,如果插入的这种行为是正确的吗?不应该插入()插入?我不知道标准是什么。不幸的是我没有它(C ++标准)所以我无法检查。
感谢您提供有用的ansers。

2 个答案:

答案 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;
    }
}
相关问题