c++map set

map部分的内容参考了这篇文章 https://blog.csdn.net/sevenjoin/article/details/81943864
set部分参考了这篇https://blog.csdn.net/sevenjoin/article/details/81908754

接前一篇,如果说deque对应python中的列表,那么map和set就分别对应python中的字典和集合了。相当重要的两个容器。

Map

map存放key-value对,在内部自建一个红黑树存储,因此map是有序的。
插入元素的方式有三种,但我相信我只会记住也只会用其中一种。
初始化&插入元素:
map<int, string> a;
a[10] = “abc”;(如果已经存在a[10],则会覆盖原值)
可以直接a[10]取得对应的value值。

//迭代器的使用
int main()
{
    map<int, string> a;
    a[10] = "abc";
    a[1] = "a";
    for(auto i = a.begin(); i != a.end(); i++)
        cout << i->first << ":" << i->second << endl;
}
//or
int main()
{
    map<int, string> a;
    a[10] = "abc";
    a[1] = "a";
    for(auto & i : a)
        cout << i.first << ":" << i.second << endl;
}
//out:
//1:a
//10:abc

上面第二种写法是clion自动优化过后的,结合比较之前几个容器的迭代器,确认了iterator实际就是每个容器对应的地址。map这个容器在存取元素时是用的类似于结构体的东西,会有first和second对应key和value,在获取first和second时,由于iterator是地址,所以要用->

在map中用erase删除元素有两种方式,一是以迭代器为参数,二是以键key为参数,均可以删除。还可以用迭代器删除一个区间内所有的元素(不常用)

map<char int> m;
m['a'] = 1;
m['b'] = 2;
m.erase('b');
m.erase(m.begin());

可以用count(key)来获取是否已经存在某键值对

map<int, int> m;
m[1] = 10;
m[2] = 20;
cout << m.count(1) << endl << m.count(3) << endl;
//out:
//1
//0

当然作为stl容器的一份子,以下成员函数它也拥有。
clear
empty
size

Set

同map一样,set内部也是用二叉树(红黑树)存储的,因此里面的元素均是有序的,每个元素最多存储一次。
set又分为很多种
1,按关键字有序保存元素:set(关键字即值,即只保存关键字的容器);multiset(关键字可重复出现的set);
2,无序集合:unordered_set(用哈希函数组织的set);unordered_multiset(哈希组织的set,关键字可以重复出现)。
个人认为set最为常用,剩下的可以用其他容器代替。

初始化&插入元素:

set<int> a;
a.insert(1);

set和map相似,成员和之前说的几个stl容器有区别。insert只有一个参数,那就是存储的关键字key,而不需要添加位置position。(因为set是红黑树存储,不是顺序结构,加入元素之后自动排序)
成员函数:
set有个很容易被忽视的函数,count(value),用来判断某个元素是否在set中,如果在返回1,不在返回0.
size
clear
empty
erase同insert一样,直接删除关键字
begin
end

int main()
{
    set<int> a;
    a.insert(3);
    a.insert(2);
    a.insert(1);
    a.erase(2);
    for(auto s = a.begin(); s != a.end(); s++)
        cout << *s;
}
//out:13
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值