【发布时间】:2012-01-25 23:42:35
【问题描述】:
我发现他们只有一个键和多个值。
【问题讨论】:
标签: c++ map containers key-value multimap
我发现他们只有一个键和多个值。
【问题讨论】:
标签: c++ map containers key-value multimap
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;
}
std::multimap 等于 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;
}
std::set 类似于std::map,但它不存储与值关联的键。它只存储密钥类型,并确保它在集合中是唯一的。
您还拥有std::multiset,它遵循相同的模式。
所有这些容器都通过它们的 find / equal_range 提供 O(log(n)) 访问。
【讨论】:
std::pair<auto first, auto second> range = myMap.equal_range("test"); 这一行不起作用,因为error: 'auto' not allowed in template argument。请改用const auto range = myMap.equal_range("test")。
multimap 存储成对的 (key, value),其中 key 和 value 都可以出现多次。
map<key, set<value>> 只会为特定键存储每个值一次。为此,它必须能够比较值,而不仅仅是键。
这取决于您的应用程序,比较相等的值是否相等,或者您是否希望单独存储它们。也许它们包含不同但不参与集合比较的字段。
【讨论】:
std::multimap<key, value> 允许同一个键多次出现,而 std::map<key, whatever> 需要 key 的唯一性。
map::insert
因为map容器不允许重复的键值,插入操作会检查每个插入的元素容器中是否已经存在具有相同键值的另一个元素,如果存在,则不插入该元素并且其映射值是没有任何改变。
另一方面
multimap::insert
可以使用相同的键插入任意数量的项目。
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/
【讨论】:
后者要求值可以排序(通过operator< 或比较函数),前者不需要。
【讨论】:
T,它没有排序。您可以使用它来创建std::multimap<U, T>,但不能使用它来创建std::map<U, std::set<T> >。