ACM和OI算法常用STL整理

有一些东西老忘,总结一些

1.end()为迭代器的最后一位的后一位

2.back()map和set和stack()没有

#include <bits/stdc++.h>
using namespace std;
int main(){
   
   
    
    string a = "dasdasdsadsah";
    vector<char>h;
    queue<char>q;
    stack<char>p;

    p.push('d');
    p.push('c');


    q.push('q');
    q.push('k');
    q.push('l');
    q.push('o');
    
    h.push_back('d');
    h.push_back('h');
    h.push_back('w');

    cout<<(a.back())<<endl;
    cout<<(h.back())<<endl;
    cout<<(q.back())<<endl;
    /* auto p = q.find("da"); */
    /* cout<<p->second<<"\n"; */
    return 0;
}

结果
h
w
o

结构体内嵌比较函数bool operator < (const node &x) const {}
关于结构体内嵌比较函数:
一般情况下:

1 struct node
2 {
   
   
3     int l,r;
4     bool operator <(const node &a)const{
   
   
5         return r < a.r;
6     }
7 }a[maxn];

直接写比较函数是裸的r表示当前的值,如果r<a.r,那么就是从小到大排序,但是优先队列的是相反的,sort默认为从小到大排序,优先队列默认为从大到小。

1 struct node
2 {
   
   
3     int l,r;
4     bool operator <(const node &a)const
5     {
   
   
6         return r>a.r;
7     }
8 };
9 priority_queue<node> q;

那么这个优先队列是按r小的优先出队。


string类

常用操作 功能
=,assign 赋以新值
Swap 交换两个字符串的内容
+=,append( ),push_back() 添加字符
insert () 插入字符
erase() 删除字符
clear () 移除全部字符
resize () 改变字符数量
replace() 替换字符
+ 串联字符串
==,! =,<,<=,>,>=,compare() 比较字符串内容
size(),length() 返回字符数量,只有string有length选项
max_size () 返回字符的最大可能个数
empty () 判断字符串是否为空
reserve() 保留内存以存储一定数量的字符
>>,getline() 从 stream 中读取某值
<< 将值写入 stream
copy() 将内容复制为一个 C - string
c_str() 将内容以 C - string 形式返回
data() 将内容以字符数组形式返回
substr() 返回子字符串位置kmp
find() 搜寻某子字符串或字符
begin( ),end() 提供正向迭代器支持
rbegin(),rend() 提供逆向迭代器支持

优点:支持一切数组操作,吃回车问题解决,字符串相加比较操作简单
两种输入测试: 第一种输一行相当于fgets,第二种是输入一个单词

#include <iostream>
using namespace std;
int main(){
   
   

    string a,b;
    getline(cin,a);
    cin>>b;
    cout<<a<<" "<<b<<endl;                                                                                                                                     
    return 0;
}  

set集合

优点:有序,唯一

常用操作 功能
s.insert(5); 插入
erase(iterator) 删除定位器iterator指向的值
erase(first,second) 删除定位器first和second之间的值
erase(key_value) 删除键值key_value的值,set中的删除操作是不进行任何的错误检查的,比如定位器的是否合法等等,所以用的时候自己一定要注意。
s.find(10); 查找,返回给定值值得定位器,如果没找到则返回end()。
s.count(a) 返回的是被查找元素的个数,如果有,返回1;否则,返回0。因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
s.begin() ,返回set容器的第一个元素
s.end() ,返回set容器的最后一个元素
s.clear() ,删除set容器中的所有的元素
s.empty() ,判断set容器是否为空
s.max_size() ,返回set容器可能包含的元素最大个数
s.size() ,返回当前set容器中的元素个数
s.rbegin() ,返回的值和end()相同
s.rend() ,返回的值和rbegin()相同
s.lower_bound(k) 就是指向第一个键k对应的第一个元素
s.upper_bound(k) 就是指向大于键k的第一个元素
定义:set<int> s;
	set<T> s;


struct cmp{
   
   
	bool operator()(const int& a,const int& b){
   
   
		return a > b;
	}
};
struct cmp{
   
   
	bool operator()(const T& t1,const T& t2){
   
   
		 if(t1.x != t2.x)
             return t1.x < t2.x -->按x降序
     return t1.y > t2.y   -->x相等时按y升序
	}
};

模板题uva10815 迭代器使用 + stringstream使用 + set使用 + string类使用
什么是stringstream

摘例解释stringstream
#include <sstream>
#include <iostream>
int main()
{
   
   
    std::stringstream stream;
    int first, second;
    stream<< "456"; //插入字符串
    stream >> first; //转换成int
    std::cout << first << std::endl;
    stream.clear(); //在进行多次转换前,必须清除stream
    stream << true; //插入bool值
    stream >> second; //提取出int
    std::cout << second << std::endl;
} 
#include <bits/stdc++.h>
using namespace std;
int main(){
   
   

    set<string> q;
    string s,buf;
    while(cin >> s){
   
   
        for(int i = 0;i < s.length();i++)
            if(isalpha(s[i]))
                s[i] = tolower(s[i]);
            else
                s[i] = ' ';
        stringstream ss(s);

        while(ss >> buf){
   
   
            q.insert(buf);
        }
    }
    //for(set<string>::iterator it = q.begin(); it != q.end(); it++)
     for(auto it = q.begin(); it != q.end(); it++) //c++11新特性
        cout<<*it<<endl;
    return 0;
}

map

优点:map和set有序关联容器:红黑树 增删改O(log2n) 2是底数
map和set的插入删除效率比其他序列容器高,这是因为:
set中所有元素都是以节点的方式来存储的,其节点结构和链表类似,指向父节点和子节点。所以,在插入和删除时不需要做内存拷贝和内存移动,故而提高了效率。

常用操作 功能
m.size(); map元素个数
m.count(a) 返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器
erase() 删除一个元素删除:erase(key) erase(it) //既可以按照key值删除,也可以按照迭代器删除
find() 查找一个元素
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound(k) 返回键值k>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
swap() 交换两个map
upper_bound(k) 返回键值k>给定元素的第一个位置
value_comp() 返回比较元素value的函数
声明:
	map<string , int >mapstring;         map<int ,string >mapint;
   map<sring, char>mapstring;         map< char ,string>mapchar;
   map<char ,int>mapchar;            map<int ,char >mapint;


//插入的三种方式
m["jack"] = 98; //区别是这个不报错
m.insert(pair<string,float>("jack",98));
m.insert(map<string,float>::value_type("jack",98));

hdu2063 两层map

#include <bits/stdc++.h>
using namespace std;

struct node{
   
   
    map<string,int> shuiw;
};

map<string,node> q;

int main(){
   
   

    string di,guo;
    int n,m,jia;
    cin>>n;
    while(n--){
   
   
        q.clear();
        cin>>m;
        while(m--)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Randy__Lambert

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值