有一些东西老忘,总结一些
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--)