C++STL关联式容器---map和set常用的接口用法以及map和set的区别

下面是我的另外一篇文章:
C++STL基本容器的使用
https://blog.csdn.net/qq_37941471/article/details/81980246

set


set 和 map 都是基于红黑树来实现的;两种都属于关联式容器。

K模型 :

set里面每个元素只存有一个key,它支持高效的关键字查询操作,
比如检查一个关键字是否在set中或者在 某些文本处理过程中可用set保存想要忽略的单词
set的常用接口:
begin()        返回set容器的第一个元素

end()         返回set容器的最后一个元素

rbegin        返回的值和end()相同

rend()        返回的值和rbegin()相同

lower_bound()    删除一个区间的下界

upper_bound()    删除一个区间的上界

find()          查找

上面的是搭配迭代器一起来实现

clear()         删除set容器中的所有的元素

empty()        判断set容器是否为空

max_size()      返回set容器可能包含的元素最大个数

size()        返回当前set容器中的元素个数

下面用代码来实现:

#pragma once 
#include <iostream>
#include <iterator>
#include <set>
using namespace std;


void Print( set<int> s )
{
    cout<<"正向迭代器:"<<endl;
    set<int>::iterator it1 = s.begin();
    while( it1 != s.end() )
    {
        cout<<*it1<<" ";
        ++it1;
    }
    cout<<endl;
}
void RPrint( set<int> s )
{
    cout<<"反向迭代器:"<<endl;
    set<int>::reverse_iterator it1 = s.rbegin();
    while( it1 != s.rend() )
    {
        cout<<*it1<<" ";
        ++it1;
    }
    cout<<endl;
}
void testSet()
{
    set<int> s1;

    // 1. 插入数据
    for( int i = 0; i < 10; i++ )
    {
        s1.insert(i*10);
    }

    Print(s1);
    RPrint(s1);

    // 2. 容量
    cout<<"容量大小:"<<endl;
    cout<<s1.size()<<endl;
    cout<<endl;

    // 3. 输出pos位
    set<int>::iterator pos = s1.find(20);
    if( pos != s1.end() )
        s1.erase(pos);
    s1.erase(30);
    cout<<"删除20 30 后:"<<endl;
    Print(s1);
    cout<<endl;

    // 4. 删除15-50之间的数

    set<int>::iterator low = s1.lower_bound(15);
    set<int>::iterator up = s1.upper_bound(50);
    s1.erase(low,up);
    Print(s1);
    cout<<endl;

    // 5. 判断60是否存在
    if( s1.count(60) )
    {
        cout<<"60存在\n"<<endl;
    }
    else
    {
        cout<<"60不存在\n"<<endl;
    }

    // 6. 删除set容器中的所有的元素
    s1.clear();
    Print(s1);
}

这里写图片描述

map


K V模型:
 map里面存的是一些key-value对,其中key起到索引的作用, 
 而value则表示于索引相关联的数据。
比如字典就是一个很好使用map的例子,把单词当作key,解释当作value
map的常用接口:
      begin()          返回指向map头部的迭代器
      clear()         删除所有元素
      count()          返回指定元素出现的次数
      empty()          如果map为空则返回true
      end()            返回指向map末尾的迭代器
      equal_range()    返回特殊条目的迭代器对
      erase()          删除一个元素
      find()           查找一个元素
      get_allocator()  返回map的配置器
      insert()         插入元素
      key_comp()       返回比较元素key的函数
      lower_bound()    返回键值>=给定元素的第一个位置
      max_size()       返回可以容纳的最大元素个数
      rbegin()         返回一个指向map尾部的逆向迭代器
      rend()           返回一个指向map头部的逆向迭代器
      size()           返回map中元素的个数
      swap()            交换两个map
      upper_bound()     返回键值>给定元素的第一个位置
      value_comp()      返回比较元素value的函数
头文件: #include <map>

//1.定义和初始化

    map<int,string> map1;                                 // 空map

    //2.常用操作方法
    map1[3] = "Saniya";                                   // 添加元素
    map1.insert(map<int,string>::value_type(2,"Diyabi")); // 插入元素
    //map1.insert(pair<int,string>(1,"Siqinsini"));
    map1.insert(make_pair<int,string>(4,"V5"));
    string str = map1[3];                                 // 根据key取得value,key不能修改
    map<int,string>::iterator iter_map = map1.begin();    // 取得迭代器首地址
    int key = iter_map->first;                            // 取得key
    string value = iter_map->second;                      // 取得value
    map1.erase(iter_map);                                 // 删除迭代器数据
    map1.erase(3);                                        // 根据key删除value
    map1.size();                                          // 元素个数
    map1.empty();                                         // 判断空
    map1.clear();                                         // 清空所有元素

//3.遍历

    for(map<int,string>::iterator iter = map1.begin();iter!=map1.end();iter++)
    {
       int keyk = iter->first;
       string valuev = iter->second;
    }
用法一: 初始化 和 插入元素
#pragma once 
#include <iostream>
#include <string>
#include <map>
using namespace std;

void Print( map<string,string> dict )
{
    cout<<"正向迭代器:"<<endl;
    map<string,string>::iterator it1 = dict.begin();
    while( it1 != dict.end() )
    {
        cout<<it1->first<<" : "<<it1->second<<endl;
        ++it1;
    }
    cout<<endl;
}

void RPrint( map<string,string> dict )
{
    cout<<"反向迭代器:"<<endl;
    map<string,string>::reverse_iterator it1 = dict.rbegin();
    while( it1 != dict.rend() )
    {
        cout<<it1->first<<" : "<<it1->second<<endl;
        ++it1;
    }
    cout<<endl;
}

void testMap()
{
    map<string,string> dict;
    dict.insert(pair<string,string>("sort","排序"));
    dict.insert(pair<string,string>("insert","插入"));
    dict.insert(pair<string,string>("string","字符串"));
    dict.insert(pair<string,string>("int","整型"));
    dict.insert(pair<string,string>("char","字符"));

    Print(dict);
    cout<<endl;

    RPrint(dict);
    cout<<endl;

}
#pragma once 
#include <iostream>
#include <string>
#include <map>
using namespace std;

void Print( map<int,string> dict )
{
    cout<<"正向迭代器:"<<endl;
    map<int,string>::iterator it1 = dict.begin();
    while( it1 != dict.end() )
    {
        cout<<it1->first<<" : "<<it1->second<<endl;
        ++it1;
    }
    cout<<endl;
}

void RPrint( map<int,string> dict )
{
    cout<<"反向迭代器:"<<endl;
    map<int,string>::reverse_iterator it1 = dict.rbegin();
    while( it1 != dict.rend() )
    {
        cout<<it1->first<<" : "<<it1->second<<endl;
        ++it1;
    }
    cout<<endl;
}

void test1()
{
    map<int,string> dict;

    // 三种插入数据的方法
    dict[2] = "hello";
    dict.insert(pair<int,string> (1,"world"));
    dict.insert(map<int,string>::value_type (0,"hello"));

    Print(dict);
    cout<<endl;

    RPrint(dict);
    cout<<endl;

}
运行结果:

这里写图片描述

用法二:
void Print( map<int,int> dict )
{
    cout<<"正向迭代器:"<<endl;
    map<int,int>::iterator it1 = dict.begin();
    while( it1 != dict.end() )
    {
        cout<<it1->first<<" : "<<it1->second<<endl;
        ++it1;
    }
    cout<<endl;
}

void RPrint( map<int,int> dict )
{
    cout<<"反向迭代器:"<<endl;
    map<int,int>::reverse_iterator it1 = dict.rbegin();
    while( it1 != dict.rend() )
    {
        cout<<it1->first<<" : "<<it1->second<<endl;
        ++it1;
    }
    cout<<endl;
}

void test1()
{
    map<int,int> dict;

    // 三种插入数据的方法
    dict[2] = 200;
    dict.insert(pair<int,int> (1,100));
    dict.insert(map<int,int>::value_type (0,10));

    cout<<"删除之前的元素总个数:"<<dict.size()<<endl;
    cout<<endl;

    Print(dict);
    cout<<endl;

    RPrint(dict);
    cout<<endl;


    dict.erase(2);
    cout<<"删除之后的元素总个数:"<<dict.size()<<endl;
    cout<<endl;

    Print(dict);
    cout<<endl;

    RPrint(dict);
    cout<<endl;


}
运行结果:

这里写图片描述

用法三:
void Print( map<int,int> dict )
{
    cout<<"正向迭代器:"<<endl;
    map<int,int>::iterator it1 = dict.begin();
    while( it1 != dict.end() )
    {
        cout<<it1->first<<" : "<<it1->second<<endl;
        ++it1;
    }
    cout<<endl;
}

void RPrint( map<int,int> dict )
{
    cout<<"反向迭代器:"<<endl;
    map<int,int>::reverse_iterator it1 = dict.rbegin();
    while( it1 != dict.rend() )
    {
        cout<<it1->first<<" : "<<it1->second<<endl;
        ++it1;
    }
    cout<<endl;
}

void test1()
{
    map<int,int> dict;

    for( int i = 0; i < 10; i++ )
    {
        dict.insert(pair<int,int> (i,i*10));
    }

    Print(dict);
    cout<<endl;

    RPrint(dict);
    cout<<endl;

}
运行结果:

这里写图片描述

用法四:删除指定范围的数字

void test1()
{
    map<int,int> dict;

    for( int i = 0; i < 10; i++ )
    {
        dict.insert(pair<int,int> (i,i*10));
    }

    map<int,int>::iterator low = dict.lower_bound(2);
    map<int,int>::iterator up = dict.upper_bound(5);
    dict.erase(low,up); // 左闭右闭区间

    Print(dict);
    cout<<endl;

    RPrint(dict);
    cout<<endl;

}
运行结果:

这里写图片描述

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值