c++学习笔记(三)

STL (Standard Template Library) 标准模版库

一、sort 二、二分查找

三、排序容器

1. multiset

  • 要 #include;

  • 用法1: multiset st;
    • 定义了一个multiset变量st,st里面可以存放T类型的数据,并且能自动排序

    • 排序的规则: 表达式 a<b 为true,则a排在b前面,否则b排a前面 (从小到大)
    • st.insert(i) 添加元素 st.find(i) 查找和i相等的元素,返回值是迭代器 st.erase(i) 删除元素
    • st.begin()返回指向第一个元素的迭代器 st.end()返回指向最后一个元素后面的迭代器
    • st.lower_bound(i)返回指向下界的迭代器 st.upper_bound(i) 返回指向上界的迭代器

  • 迭代器(类似指针)

    • 要访问multiset得通过迭代器
    • 定义迭代器 multiset::iterator p;

    • p是迭代器,用于指向multiset中的元素。
    • 迭代器可++,--,!=,==。 但是不可以加减一个整数,也不可以相减、比大小。

#include<iostream>
#include<set>
using namespace std;
int main()
{
    int a[10] = {1,14,13,23,18,42,8,7,8,6},i;
    multiset<int> st;
    for(i = 0;i < 10;i++)
        st.insert(a[i]); //插入的只是复制品
    multiset<int>::iterator p; //p是迭代器
    for(p = st.begin();p != st.end();p++)
    {
        cout << *p << ","; //输出 1,6,7,8,8,13,14,18,23,42,
    }
    p = st.find(12); // 找不到,返回st.end() //如果找到则返回指向该元素的迭代器
    if(p == st.end())
    {
        cout<<"not found"<<endl;
    }

    p = st.lower_bound(12);
    cout<< *p << endl; //输出13
    cout<< *st.upper_bound(8) <<endl; //输出13
    st.erase(13);
    cout << *st.upper_bound(8) << endl; //输出14
    return 0;
}
  • 用法2: multiset<T,greater>

    • 与用法一相反,从大到小排
    • greater后不加括号
  • 用法3: multiset<T,Rule>

    • Rule是自定义排序规则的结构名

    • 与sort以及二分查找部分的区别是:Rule后不加括号

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

struct Student
{
    char name[20];
    int score;
};
struct Rule //先按分数从高到底,分数相同则名字按字典序排
{
    bool operator()(const Student &a1,const Student &a2)
    {
        if(a1.score != a2.score)
            return a1.score > a2.score;
        else
            return (strcmp(a1.name,a2.name) < 0);
    }
};

int main()
{
    int i ;
    multiset<Student,Rule> st;
    Student a[5] ={ {"Alier",78},{"Mestry",66},{"Jane",87},
                    {"Hebe",93},{"Arre",87}};
    for(i = 0;i < 5;i++)
    {
        st.insert(a[i]);
    }
    multiset<Student,Rule>::iterator p;
    for(p = st.begin();p != st.end();p++)
    {
        cout << p->score << " "<< p->name << endl;
    }
    return 0;
}
/*输出
93 Hebe
87 Arre
87 Jane
78 Alier
66 Mestry */

2. set

  • 与multiset的区别

    • set不能有重复元素(重复的意思是按照排序规则是相等的)
    • insert插入可能失败(因为可能插入的元素已经存在)

    • insert返回值是 pair< set::iterator , bool > ,如果插入成功则返回指向插入的元素的迭代器,bool为true;插入失败返回的迭代器指向的是与插入元素相同的元素的位置,bool为false

struct Student
{
    char name[20];
    int score;
};
struct Rule //先按分数从高到底,分数相同则名字按字典序排
{
    bool operator()(const Student &a1,const Student &a2)
    {
        if(a1.score != a2.score)
            return a1.score > a2.score;
        else
            return (strcmp(a1.name,a2.name) < 0);

    }
};
int main()
{
    set<int> st;
    int a[10] = {1,14,13,23,18,42,8,7,8,7},i;
    for(i = 0;i < 10;i++)
        st.insert(a[i]);
    cout << st.size() << endl; // 输出8 因为数组里有两个7两个8
  
    set<Student,Rule> t;
    Student s[6] ={ {"Alier",78},{"Mestry",66},{"Jane",87},
                    {"Hebe",93},{"Arre",87},{"Arre",87} };
    pair<set<Student,Rule>::iterator,bool> result;
  /*相当于 sturct { 
                    set<Student,Rule>::iterator first
                    bool second
}*/
    for(i = 0;i < 6;i++)
    {
        result = t.insert(s[i]);
        if(!result.second)
        {
            cout << result.first->score << " " << result.first->name << " has existed"<< endl;
        }
        else
        {
            cout << result.first->score << " " << result.first->name << " inserted" << endl;
        }
    }
    return 0;
}
/* 输出
8
78 Alier inserted
66 Mestry inserted
87 Jane inserted
93 Hebe inserted
87 Arre inserted
87 Arre has existed */
  • pair
pair<T1,T2> a;      //T1 T2指的是类型
等价于
  struct 
  {
    T1 first;
    T2 second;
  }
上一篇:STL(标准模板库)笔记——平衡二叉树multiset


下一篇:C++之set和multiset容器初学