讲解STL
Posted Keep--Silent
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了讲解STL相关的知识,希望对你有一定的参考价值。
介绍一些实用的STL容器, 容器用于存储数据。
想要掌握STL,应该在平常做题过程中多用容器。
容器遍历需掌握auto 和 iterator
基础
queue
队列,FIFO(先进先出)
int x, y, n;
queue<int> q;
q.push(12);
q.push(13);
printf("size=%d\\n",q.size());
printf("q.front()=%d\\n",q.front());//取front不改变队列
printf("size=%d\\n",q.size());
q.pop();
printf("size=%d\\n",q.size());
stack
栈, FILO(先进后出)
stack<int> s;
q.push(12);
q.push(13);
x=q.top();//x=13,取top不改变队列
q.pop();
y=q.top();//y=12
n=q.size();//n=1;
string
字符串
char ss[1000];
string s;
cin >> s;
scanf("%s", ss);
s = ss;
for (int i = 0; i < s.size(); i++)
{
printf("%c", s[i]);
}
printf("%s\\n", s.c_str());//%s是输出字符数组,字符串要当成字符数组输出,需要c_str()
cout << s << endl;
cout << s.c_str() << endl;
//
string str1("CAB");
unsigned int loc = str1.find("B", 0);//find,查找,重点
if (loc != string::npos)
cout << "Found B at " << loc << endl;
else
cout << "Didn't find B" << endl;
string t1 = "123", t2 = "assdh";
char ch = ')';
s = t1 + t2;//字符串与字符串相加,字符串与字符相加,是拼接行为
s = s + ch;
cout<<s<<endl;
//s.erase()
//s.insert()
//s.replace()
例题
说明:strings之间大小的比较是按照字典序规则
priority_queue
优先队列,不细讲
点击跳转
vector
向量
vector<int>v;
int x,n=0;
for(int i=0;i<v.size();i++){
printf("%d ",v[i]);
}
for(auto it :v){
printf("%d ",it);
}
for(vector<int>::iterator it =v.begin();it!=v.end();it++){
printf("%d ",*it);
}
//v.insert()
//v.erase()
说明:vectors之间大小的比较是按照词典规则
set
集合(Set)是一种包含已排序对象的关联容器
set<int>s;
s.insert(1);
s.insert(1);
s.insert(2);
int n=s.size();
for(auto it :s){
printf("%d ",it);
}
for(set<int>::iterator it =s.begin();it!=s.end();it++){
printf("%d ",*it);
}
class Solution
{
public:
int distributeCandies(vector<int> &candies)
{
set<int> s;
for (auto x : candies)
s.insert(x);
return min(candies.size() / 2, s.size());
}
};
map
C++ Maps是一种关联式容器,包含“关键字/值”对
key->value;
map<string, string> q;
q["ZhouSanJin"] = "ZhanShen";//注意,直接访问未存的结点会创建该结点
printf("%s\\n", q["ZhouSanJin"].c_str());
printf("%d\\n", q.size());
printf("%s\\n", q["JingJing"].c_str());
printf("%d\\n", q.size());
if (q.find("ZhangChi") == q.end())
printf("NoFound\\n");
else
printf("Found\\n");
printf("%d\\n", q.size());
for (auto it : q)
{
printf("%s:%s\\n", it.first.c_str(), it.second.c_str());
}
for (map<string, string>::iterator it = q.begin(); it != q.end(); it++)
{
printf("%s:%s\\n", it->first.c_str(), it->second.c_str());
printf("%s:%s\\n", (*it).first.c_str(), q[(*it).first].c_str());
}
#include <bits/stdc++.h>
using namespace std;
char ss1[1000];
char ss2[1000];
int main()
{
//key->value
//value=q[key]
string s;
map<string, int> cnt; //key发言了cnt[key]次
map<string, int> pot; //key第一次说话在pot[key]
int n, i;
cin >> n;
getchar();
string ans;
for (int i = 0; i < n; i++)
{
scanf("%[^':']s", ss1);
scanf("%[^'\\n']s", ss2);
getchar();
s = ss1;
if (pot.find(s) == pot.end())
{
pot[s] = i + 1;
}
cnt[s]++;
if (cnt[ans] < cnt[s])
ans = s;
else if (cnt[ans] == cnt[s])
{
if (pot[ans] < pot[s])
ans = s;
}
}
cout << ans << endl;
return 0;
}
进阶
学会STL容器之间的合用
map_vector,vector_vector
map< vector, >
vector< vector >
void prinf(vector<vector<int>> v){
for (auto it : v)
{
for(int i=0;i<it.size();i++){
printf("%d ",it[i]);
}
cout<<endl;
}
cout<<endl;
}
vector<vector<int>> v(2, vector<int>(2, 0));
v[0][0] = 3;
v[0][1] = 2;
v[1][0] = 1;
v[1][1] = 4;
prinf(v);
for(auto &it:v){//&很重要
sort(it.begin(),it.end());
}
prinf(v);
sort(v.begin(),v.end());
prinf(v);
#include <bits/stdc++.h>
using namespace std;
map<vector<int>, int> q; //first have q[first]=second
vector<vector<int> >ans;
void prinf(vector<vector<int>> v){
for (auto it : v)
{
for(int i=0;i<it.size();i++){
printf("%d ",it[i]);
}
cout<<endl;
}
cout<<endl;
}
int main(int argc, char *argv[])
{
int n, m, i, j;
cin >> n >> m;
vector<int> v(m);
for (int i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &v[j]);
}
q[v]++;
}
for (auto it :q){
// for(int i=0;i<it.first.size();i++){
// printf("%d ",it.first[i]);
// }
//printf(":...%d",it.second);
//cout<<endl;
ans.push_back(it.first);
ans[ans.size()-1].insert(ans[ans.size()-1].begin(),-1*it.second);
}
printf("%d\\n",ans.size());
sort(ans.begin(),ans.end());
//prinf(ans);
// ?: flag?"true that":"false that"
// printf("%s\\n",true?"true that":"false that");
// printf("%s\\n",false?"true that":"false that");
for(auto it:ans){
for(int i=0;i<it.size();i++){
printf("%d%s",i==0?-it[i]:it[i],i==it.size()-1?"\\n":" ");
}
}
return 0;
}
vector[]
补充
取模
①:
a
b
%
m
o
d
=
a
%
(
b
×
m
o
d
)
b
\\frac{a}{b}\\%mod ={\\frac{a\\%(b \\times mod)}{b}}
ba%mod=ba%(b×mod),使用过程 注意数据范围
②:
a
b
%
m
o
d
=
a
×
b
m
o
d
−
2
%
m
o
d
\\frac{a}{b}\\%mod=a \\times b^{mod-2}\\%mod
ba%mod=a×bmod−2%mod
以上是关于讲解STL的主要内容,如果未能解决你的问题,请参考以下文章