C++学习笔记——STL常用容器——set和map

set:

所有元素在插入时自动排序,底层结构用二叉树实现。

set和multiset的区别:

set不允许容器中有重复的元素,multiset允许容器中有重复的元素。

set构造和赋值:

构造:
//默认构造函数
set<T> st;
//拷贝构造函数
set(const set &st);      

赋值:
//重载等号操作符
set& operator=(const set &st); 

set大小和交换:

//返回容器中元素的数目
size();
//判断容器是否为空
empty();
//交换两个集合容器
swap(st);

set插入和删除:

//在容器中插入元素。
insert(elem);
//清除所有元素
clear();
//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(pos);
//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(beg, end);
//删除容器中值为elem的元素。
erase(elem); 

例子:

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


void print_set(const set<int>& s){
    for(set<int>::const_iterator it=s.begin();it!=s.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;
}

void test01(){
    set<int> s;
    s.insert(10);
    s.insert(20);
    s.insert(15);
    s.insert(14);
    s.insert(12);
    print_set(s);

    s.erase(s.begin());
    print_set(s);

    s.erase(20);
    print_set(s);

    s.clear();
    print_set(s);
}

int main() {
    test01();
    return 0;
}

set查找和统计:

//查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
find(key);
//统计key的元素个数
count(key);   

pair对组创建:

对于成对出现的数据,利用对组可以返回两个数据。

两种创建方式:

pair<type, type> p ( value1, value2 );
pair<type, type> p = make_pair( value1, value2 );

例子:

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


void test01(){
    pair<string,int> pair1("li",16);
    cout<<"name:"<<pair1.first<<" age:"<<pair1.second<<endl;

    pair<string,int> pair2=make_pair("wang",20);
    cout<<"name:"<<pair2.first<<" age:"<<pair2.second<<endl;
}

int main() {
    test01();
    return 0;
}

set容器排序:

利用仿函数可以改变排序规则。

例子:

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

class MyCompare{
public:
    bool operator()(int a,int b){
        return a>b;
    }
};
void test01(){
    set<int> s;
    s.insert(5);
    s.insert(15);
    s.insert(10);
    s.insert(16);
    s.insert(20);
    s.insert(3);

//    默认从小到大
    for(set<int>::iterator it=s.begin();it!=s.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;

//    指定排序规则
    set<int,MyCompare> s2;
    s2.insert(15);
    s2.insert(10);
    s2.insert(20);
    s2.insert(16);
    for(set<int>::iterator it=s2.begin();it!=s2.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;

}

int main() {
    test01();
    return 0;
}

map:

map中所有元素都是pair;

pair中第一个元素为key,起到索引所用,第二个元素为value;

所有元素会根据元素的key进行排序。

本质:底层使用二叉树实现。

map和multimap区别:

map中不允许容器中有重复key值的元素;

multimap允许容器中有重复key值的元素。

map构造和赋值:

构造:
//map默认构造函数: 
map<T1, T2> mp;
//拷贝构造函数
map(const map &mp);            

赋值:
//重载等号操作符
map& operator=(const map &mp);  

map大小和交换:

//返回容器中元素的数目
size();
//判断容器是否为空
empty();
//交换两个集合容器
swap(st); 

map插入和删除:

//在容器中插入元素。
insert(elem);
//清除所有元素
clear();
//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(pos);
//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(beg, end);
//删除容器中值为key的元素。
erase(key);  

map查找和统计:

//查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
find(key);
//统计key的元素个数
count(key);   

例子:

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


void print_map(map<int,int> &m){
    for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
        cout<<"key = "<<it->first<<" value = "<<it->second<<endl;
    }
}

void test01(){
    map<int,int> m;
    m.insert(make_pair(1,20));
    m.insert(make_pair(2,30));
    m.insert(make_pair(3,40));
    if(!m.empty()){
        cout<<"the size of m is : "<<m.size()<<endl;
        print_map(m);
    }
}

void test02(){
    map<int,int> m;
//    第一种插入方式
    m.insert(pair<int,int>(1,10));
//    第二种插入方式
    m.insert(make_pair(2,20));
//    第三种插入方式
    m.insert(map<int,int>::value_type(3,30));
//    第四种插入方式
    m[4]=40;
    print_map(m);

    m.erase(m.begin());

    m.erase(2);
    print_map(m);

    m.clear();
    print_map(m);
}

void test03(){
    map<int,int> m;
    m.insert(make_pair(1,20));
    m.insert(make_pair(2,30));
    m.insert(make_pair(3,40));
    if(m.find(2)!=m.end()){
        cout<<"找到了元素"<<endl;
    }else{
        cout<<"未找到"<<endl;
    }

    int num=m.count(2);
    cout<<"num="<<num<<endl;
}

int main() {
    test01();
    test02();
    test03();
    return 0;
}

map的排序也可以用仿函数改变排序规则,默认为按照key从小到大。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值