multimap

  1. 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 对象是不能被复制的

更全面的:
https://www.cnblogs.com/lengbingshy/p/3491192.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值