HNFMS一个初二蒟蒻OIerの实验室

C++中的STL笔记——set

为什么要首先写set?

STL中好用的东西不少嘛,老师的标程里面有时候就有stack,queue,vector,map这类,这些我现在都会用嘛,今天看老师标程的时候发现有个set我没听过(感觉自己太蒟蒻了(→_→)),题目是lg1189,代码是这样

#include <iostream>
#include <cstring>
#include <string>
#include <map>
#include <set>
#include <cstdio>
using namespace std;

string m[60];
int r, c, n;
set<pair<int, int> > now;
int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

int main()
{
    freopen("search.in","r",stdin);
    freopen("search.out","w",stdout);
    now.clear();
    cin >> r >> c;
    for (int i = 0; i < r; i++)
        cin >> m[i];
    for (int i = 0; i < r; i++)
        for (int j = 0; j < c; j++)
            if (m[i][j] == '*')
            {
                now.insert(make_pair(i, j));
                m[i][j] = '.';
                break;
            }

    cin >> n;
    for (int i = 0; i < n; i++)
    {
        string tmp;
        cin >> tmp;
        int d;
        if (tmp == "NORTH")
            d = 0;
        else if (tmp == "SOUTH")
            d = 1;
        else if (tmp == "WEST")
            d = 2;
        else
            d = 3;

        set<pair<int, int> > pre(now);
        now.clear();
        for (set<pair<int, int> >::iterator it = pre.begin(); it != pre.end(); it++)
        {
            int x = it->first;
            int y = it->second;
            for (int nx = x + dir[d][0], ny = y + dir[d][1];; nx += dir[d][0], ny += dir[d][1])
            {
                if (nx < 0 || nx >= r || ny < 0 || ny >= c || m[nx][ny] == 'X')
                    break;
                now.insert(make_pair(nx, ny));
            }
        }
    }
    for (set<pair<int, int> >::iterator it = now.begin(); it != now.end(); it++)
    {
        int x = it->first;
        int y = it->second;

        m[x][y] = '*';
    }

    for (int i = 0; i < r; i++)
        cout << m[i] << endl;
    return 0;
}

(真的不是凑字数,关于代码中的pair,并不是特别难理解/记忆,可参考https://blog.csdn.net/sevenjoin/article/details/81937695

关于set

关于set,必须说明的是set关联式容器。 set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。

使用的头文件

bits/stdc++.h当然就不说了啦,如果需要使用set,可单独引用头文件set

set的使用

set<int> s    //定义一个set容器 类型为int型
s.begin()     //返回指向第一个元素的迭代器
s.clear()     //清除所有元素
s.count()     //用来查找set中某个某个键值出现的次数,然而并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了
s.empty()     //如果集合为空,返回true
s.end()       //返回指向最后一个元素之后的迭代器
s.erase(first,second) //删除定位器first和second之间的值
s.erase(key_value) //删除键值key_value的值
s.find()      //返回一个指向被查找到元素的迭代器,如果没找到则返回end()
s.insert(key_value) //将key_value插入到set中 ,返回值是pair<set<int>::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。
s.insert(first,second) //将定位器first到second之间的元素插入到set中,返回值是void.
s.size()      //集合中元素的数目
s.swap()      //交换两个集合变量
s.lower_bound(key_value) //返回第一个大于等于key_value的定位器
a.upper_bound(key_value) //返回最后一个大于key_value的定位器

关于set自定义比较函数

struct Info  
{  
    string name;  
    float score;  
    //重载“<”操作符,自定义排序规则  
    bool operator < (const Info &a) const  
    {  
        //按score从大到小排列  
        return a.score<score;  
    }  
}  
set<Info> s; 

也可以

struct myComp  
{  
    bool operator()(const your_type &a,const your_type &b)  
    [  
        return a.data-b.data>0;  
    }  
}  
set<your_type,myComp> s;  

标签: C++ STL

Title - Artist
0:00