c++中map用法总结

引言

今天做了个简单的算法题:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
https://leetcode-cn.com/explore/featured/card/tencent/221/array-and-strings/894/
代码也很简单,主要用到了map,具体代码如下:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int,int> dat;
        for(int i=0;i<nums.size();i++)
        {
         
            if(dat.find(target-nums[i]) != dat.end())
               return{dat[target-nums[i]],i};   
             dat[nums[i]] = i;
        }
        return {};
    }
};

虽然代码很简单,完成该题也没费多大功夫,但是,却暴露了我对c++中map这一容器的生疏,故在此对map进行一个总结,也算是一个巩固。

关联容器

所谓关联容器,是相对顺序容器而言,关联容器中的元素是按照关键字(KEY)l来保存和访问的(顺序容器是根据元素在容器中的位置来保存和访问的)。关联容器中有两个最主要的类型:一个是map,另一个是set。map中的元素是键值对(key-value),其中键(key)用于索引关联的数值(value),set中只有key。其中,在map,中键值对是以pair形式存储的,pair是标准库类型,定义在头文件utility中。pair保存两个数据成员,pair的数据是public的,两个成员分别是first和second,在map中,pair.first表示key,pair.second表示value。map与set的结构如图所示:

在这里插入图片描述
map和set的Key不可变,set的元素是const的,map中pair的第一个元素是const的。

关联容器的操作

map的相关操作:

1.定义:

  • map<k, v> m;
  • map<k, v> m(m2);
  • map<k, v> m(b, e);

上述第一种方法定义了一个名为m的空的map对象;第二种方法创建了m2的副本m;第三种方法创建了map对象m,并且存储迭代器b和e范围内的所有元素的副本。
map的value_type是存储元素的键以及值的pair类型,键为const。

2.插入
a. insert()

  • m.insert(e)
  • m.insert(beg, end)
  • m.insert(iter, e)

**
b下标

在访问map时,如果map中不存在该元素,map会自动添加访问的元素。

3.查找
m.find(iter)
若存在则返回指向该元素的迭代器,否则返回m.end();
m.count(iter)
若存在则返回iter的数量(对元素可以重复的容器,会对元素计数),否则返回0
4.删除
从map中删除元素的函数是erase(),该函数有如下的三种形式:

  • m.erase(k)
  • m.erase( p )
  • m.erase(b, e)

第一种方法删除的是m中键为k的元素,返回的是删除的元素的个数;第二种方法删除的是迭代器p指向的元素,返回的是void;第三种方法删除的是迭代器b和迭代器e范围内的元素,返回void。

5.遍历
可以通过迭代器实现关联容器的循环遍历

auto iter =  =m.begin();
while(iter != m.end())
{
	cout<<iter->first();  //key
	cout<<iter->second(); //value
	++iter;
} 

在遍历过程中,通过解引用访问元素。令iter为容器的迭代器,则可通过以下方式访问元素:

(*iter).first();
(*iter).second();
或者
iter->first();
iter->second();

参考:https://blog.csdn.net/google19890102/article/details/51720305

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值