- multimap
默认的比较键的函数是 less()
multimap 容器的成员函数 insert() 插入总是成功,返回一个指向插入元素的迭代器。
iter = pets.insert(iter, std::make_pair("dog", "Spot")); // Insert Spot before Fang,元素会被插入到 iter 所指向元素的前面
multimap 不支持下标运算符,也不能使用 at() 函数。multimap 的成员函数 find() 可以返回一个键和参数匹配的元素的迭代器,如果没有找到键,会返回一个结束迭代器
iter = people.find ("Ann"); //"Ann"为要查找的键
想访问给定键对应的所有元素,用成员函数 equal_range() ,它返回一个封装了两个迭代器的 pair 对象, first 是一个迭代器,它指向第一个键和参数相同的元素。如果键不存在,pair 的成员变量 first 就是容器的结束迭代器,second 也是一个迭代器,它指向键值大于参数的第一个参数;如果没有这样的元素,它会是一个结束迭代器
auto pr = people.equal_range("Ann");
if(pr.first != std::end(people))
{
for (auto iter = pr.first ; iter != pr.second; ++iter)
continue;
}
也可以用lower_bound和upper_bound
auto iter1 = people.lower_bound("Ann");
auto iter2 = people.lower_bound("Ann");
if(iter1 != std::end(people))
{
for(auto iter = iterl ; iter != iter2; ++iter)
continue;
}
成员函数 count() 可以知道有多少个元素的键和给定的键相同。
auto n = people.count("Jack"); // Returns 2
multimap 的成员函数 erase() 有 3 个版本:
以待删除兀素的迭代器作为参数,这个函数没有返回值;
以一个键作为参数,它会删除容器中所有含这个键的元素,返回容器中被移除元素的个数;
接受两个迭代器参数,它们指定了容器中的一段元素,这个范围内的所有元素都会被删除,这个函数返回的迭代器指向最后一个被删除元素的后一个位置。
2.自定义比较函数
map 容器不能使用<=或>=来比较,等价意味着 !(key1<key2)&&!(key2<key1) 的运算值为 true。
(1)对于键重载>或者<,然后用greater或者less作为map参数
bool operator>(const Name& name) const
{
return second > name.second ||(second == name.second && first > name.first);
}
std::map<Name,size_t, std::greater<Name>>people{{Name{"Al", "Bedo"}, 53}, {Name{"Woody","Leave"},33},{Name{"Noah", "Lot"}, 43}};//greater<Name> 对象使用 > 运算符来比较 Name 对象,按照降序排列
(2)用伪函数,即函数对象来定义它。即把类对象像函数名一样使用,类中实现一个operator()
class Key_compare
{
public:
bool operator () (const std::unique_ptr<string>& p1, const std::unique_ptr <string>& p2) const
{
return *p1 < *p2;
}
};
std::map<std::unique_ptr<string>,std::string,Key_compare> phonebook;
对于这个 map,我们不能使用初始化列表,因为初始化列表包含了副本,而 unique_ptr 对象是不能被复制的