C++学习——set与map

1.set的使用

set的各成员函数列表如下:

1. begin()--返回指向第一个元素的迭代器

2. clear()--清除所有元素

3. count()--返回某个值元素的个数

4. empty()--如果集合为空,返回true

5. end()--返回指向最后一个元素的迭代器

6. equal_range()--返回集合中与给定值相等的上下限的两个迭代器

7. erase()--删除集合中的元素

8. find()--返回一个指向被查找到元素的迭代器

9. get_allocator()--返回集合的分配器

10. insert()--在集合中插入元素

11. lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器

12. key_comp()--返回一个用于元素间值比较的函数

13. max_size()--返回集合能容纳的元素的最大限值

14. rbegin()--返回指向集合中最后一个元素的反向迭代器

15. rend()--返回指向集合中第一个元素的反向迭代器

16. size()--集合中元素的数目

17. swap()--交换两个集合变量

18. upper_bound()--返回大于某个值元素的迭代器

19. value_comp()--返回一个用于比较元素间的值的函数
#include<iostream>
#include<set>
using namespace std;

/*
* set最常用于查找set数据结构中是否有某个数据
*/
int main()
{
    set<string> st;
    st.insert("ssfs");
    st.insert("ssf4qqa");
    st.insert("i love you");
    st.insert("z");
    st.insert("az");
    st.insert("i love you");//重复的会自动舍弃

    cout << "st.size()=" << st.size() << endl;

    cout <<"*st.begin()="<< *st.begin() << endl;

    set<string>::iterator it;
    for (it = st.begin(); it != st.end(); it++) {
        cout << *it << endl;
    }

    string str = "i love you";
    cout << "st.count(str)=" << st.count(str) << endl;

    if (st.find("country") == st.end()) { //很常用的用法
        cout << "st中没有" << "\"country\""<< endl;
    }
    return 0;
}
st.size()=5
*st.begin()=az
az
i love you
ssf4qqa
ssfs
z
st.count(str)=1
st中没有"country"

2.map的使用

这一部分参考:map的常见用法

#include<iostream>
#include<map>
using namespace std;

/*
* map是STL(中文标准模板库)的一个关联容器。
*可以将任何基本类型映射到任何基本类型。
*/
int main()
{
    //1.map的定义
    map<string, int> m;

    //2.map元素的插入
    //2.1 使用数组方式插入
    m["i"] = 1;
    m["love"] = 2;
    m["you"] = 3;
    m["you"] = 4;//m["you"]=4将取代m["you"]=3
    m["bo"] = 6;
    //2.2 m.insert(pair<string, int>(key,value));
    m.insert(pair<string, int>("zhong", 21));
    //2.3 m.insert(map<string,int>::value_type(key, value));
    m.insert(map<string, int>::value_type("guo", 1949));

    //3.map中元素的遍历
    map<string, int>::iterator it;
    for (it = m.begin(); it != m.end(); it++) {
        cout << it->first << " " << it->second << endl;
    }

    //4.map的查找,find(key): 若key存在,则返回key对应的迭代器,否则返回m.end()
    string str4 = "zhng";
    if (m.find(str4) != m.end()) {
        cout << "存在key=" << str4 << " value=" << m[str4] << endl;
    }
    else {
        cout << "不存在key=" << str4 << endl;
    }

    //5,map的size和empty
    cout << "m中的元素个数:" << m.size() << endl;

    //6.map的清空,删除某个元素
    // m.clear();清空
    //删除
    m.erase("zhong");
    //maps.erase(maps.begin(), maps.end());//全删除
    map<string, int>::iterator it6;
    for (it6 = m.begin(); it6 != m.end(); it6++) {
        cout << it6->first << " " << it6->second << endl;
    }
    return 0;
}
bo 6
guo 1949
i 1
love 2
you 4
zhong 21
不存在key=zhng
m中的元素个数:6
bo 6
guo 1949
i 1
love 2
you 4

3.set和map的底层实现

map和set都是C++的关联容器,其底层实现都是红黑树(RB-Tree)。由于 map 和set所开放的各种操作接口,RB-tree 也都提供了,所以几乎所有的 map 和set的操作行为,都只是转调 RB-tree 的操作行为。

4.set和map的区别

  1. map中的元素是key-value(关键字—值)对:关键字起到索引的作用,值则表示与索引相关联的数据;Set与之相对就是关键字的简单集合,set中每个元素只包含一个关键字。

  2. set的迭代器是const的,不允许修改元素的值。map允许修改value,但不允许修改key。其原因是因为map和set是根据关键字排序来保证其有序性的,如果允许修改key的话,那么首先需要删除该键,然后调节平衡,再插入修改后的键值,调节平衡,如此一来,严重破坏了map和set的结构,导致iterator失效,不知道应该指向改变前的位置,还是指向改变后的位置。所以STL中将set的迭代器设置成const,不允许修改迭代器的值;而map的迭代器则不允许修改key值,允许修改value值。

  3. map支持下标操作,set不支持下标操作。map可以用key做下标,map的下标运算符[ ]将关键码作为下标去执行查找,如果关键码不存在,则插入一个具有该关键码和mapped_type类型默认值的元素至map中,因此下标运算符[ ]在map应用中需要慎用,const_map不能用,只希望确定某一个关键值是否存在而不希望插入元素时也不应该使用,mapped_type类型没有默认值也不应该使用。如果find能解决需要,尽可能用find。


版权声明:本文为zxr916原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。