typ*_*def 69

A std::map是一个关联容器,允许您拥有与您的类型值关联的唯一键.例如,

void someFunction()
{
    typedef std::map<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    auto it = myMap.find("test");
    if (it != myMap.end())
        std::cout << "value for " << it->first << " is " << it->second << std::endl;
    else
        std::cout << "value not found" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

A std::multimap等于a std::map,但您的密钥不再是唯一的.因此,您可以找到一系列项目,而不只是找到一个唯一的项目.例如,

void someFunction()
{
    typedef std::multimap<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("test", 45));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    std::pair<auto first, auto second> range = myMap.equal_range("test");
    for (auto it = range.first; it != range.second; ++it)
        std::cout << "value for " << it->first << " can be " << it->second << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

std::set是像一个std::map,但它不存储关联到一个值的密钥.它仅存储密钥类型,并确保它在集合中是唯一的.

你也有std::multiset,遵循相同的模式.

所有这些容器都提供带有find/equal_range的O(log(n))访问.

  • 在multimap函数中,这行`std :: pair <auto first,auto second> range = myMap.equal_range("test");`不起作用,因为`error:'auto'在模板参数`中不允许.请使用`const auto range = myMap.equal_range("test")`. (5认同)
  • 地图类型?不应该是第4行的MapType吗? (2认同)

Bo *_*son 48

multimap存储(key,value)对,其中键和值可以多次出现.

map<key, set<value>>会只针对特定的密钥存储一次每个值.要做到这一点,它必须能够比较值,而不仅仅是键.

如果比较相等的值相等,或者您希望单独存储它们,则取决于您的应用程序.也许它们包含不同的字段但不参与集合的比较.

  • 因此,std :: multimap <key,value>就像std :: map <key,std :: multiset <value >>,它们之间的区别在于后者的值是排序的.是对的吗? (5认同)
  • 不,`std :: multimap &lt;key,value&gt;`可以使同一键出现多次,而`std :: map &lt;key,what &gt;​​&gt;则需要`key`的唯一性。 (2认同)

Luk*_*hne 13

map::insert
Run Code Online (Sandbox Code Playgroud)

因为map容器不允许重复键值,所以插入操作检查插入的每个元素是否已经在具有相同键值的容器中存在另一个元素,如果是,则不插入该元素并且不以任何方式更改其映射值.

另一方面

multimap::insert 
Run Code Online (Sandbox Code Playgroud)

可以使用相同的键插入任意数量的项目.

http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/


Bjö*_*lex 10

后者要求可以对值进行排序(通过operator<或比较函数),前者不需要.