STL常见用法

1、选择C++刷算法的理由

  • 1.C++速度快(C不是更快么,java太慢了)
  • 2.C++有STL(什么是STL)——使用很方便的类库
  • 3.如何使用STL进行高效刷算法
  • 4.好处:刷算法,学习成本极低
  • 5.如何从C到C++(仅基础语法到刷算法程度)
俗话说:磨刀不误砍柴工
不会c++仍然可以做,但是效率低

2、输入输出

C++保留了C的scanf和printf,增加了额外的cin与cout

例子

2.1.C程序中输入输出
int a;
scanf("%d",&a);
printf("%d",a);
2.2.C++输入输出
int a;
cin>>a;
cout<<a;
2.3.连续输入输出变量
int a,b,c;
cin>>a>>b>>c;
cout<<a<<b<<c;
2.4.优雅地换行
cout<<1;
cout<<endl;
cout<<2;
cout<<3<<endl<<endl;

好处:

1.少写了很多东西

2.连续输入输出变量

3.换行优雅

注意:cin、cout比scanf、printf慢,有时候刷算法超时,可能因为使用了cin、cout

输入输出的数量(>1000)特别多,刷算法用cin,cout容易超时

3、STL(Standard Template Library)与algorithm头文件

STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。

algorithm是对容器继承的一些算法函数,辅助刷算法题

sort函数

概念:迭代器——理解为指针

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int a[]={2,1,5,0,-1,5,9};
    sort(a,a+7);
    for(int i=0;i<7;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    system("pause");
    return 0;
}

4、STL——string(*)

概念:相当于char*的封装,理解为字符串

4.1.简单使用
/**C中定义字符串以及打印*/
char *ch="asdkajbf";
for(int i=0;ch[i]!='\0';i++) cout<<*(ch+i);
/**C++中*/
string s="ssadaffw";
cout<<s<<endl;
4.2.获取一行字符串

我想获取一行字符串

hello world

C中:

scanf("%s",ch);//1.仅获取一个单词,空格结束 2.ch[100]得设置初始大小

C++中:

string s;
getline(cin,s);//获取一行数据
cout<<s;
4.3.+=运算符

+=对于字符串,字符有效,数字会转为asc码

string s;
s+="hello";
s+=" world";
s+='5';
s+=10;//10对应的asc码是换行
int a=5;//想把a加入字符串
s+=(a+'0');
cout<<s;
4.4.排序(使用algorithm)
string s="5418340";
sort(s.begin(),s.end());
cout<<s;
4.5.erase函数
/**begin是头迭代器,end是尾迭代器*/
string s="5418340";
s.erase(s.begin());//删除第一个
s.erase(--s.end());//删除最后一个
cout<<s;
4.6.substr函数
/**begin是头迭代器,end是尾迭代器*/
string s="5418340";
s=s.substr(1,3);//取418,取索引为1,往后截断3个
s=s.substr(1,-1);//索引为1,截断到最后
cout<<s;
4.7.循环(3种)

1.for循环

string s="5418340";
for(int i=0;i<s.length();i++) cout<<s[i];

2.迭代器

for(string::iterator it=s.begin();it!=s.end();it++) cout<<*it;

3.迭代器化简

for(auto it=s.begin();it!=s.end();it++) cout<<*it;

4.利用C++ 11新特性for循环

for(auto x:s) cout<<x;

5、STL——vector(*)

概念:vector相当于数组,模板类型相当于存放的内容

1.vector构造

vector<int> v;//定义一个空vector
vector<int> v2(4);//定义一个4个大小的vector,初始为0
vector<int> v3(4,6);//定义一个4个大小的vector,初始为6
vector<int> v{1,2,3,4,5};//定义一个vector,数字为1,2,3,4,5
for(auto x:v3) cout<<x;

2.用at或者[]获取元素

vector<int> v{1,2,3,4,5};
cout<<v[1];//取索引为1的
cout<<v.at(2);//取索引为2的

3.方法

  • push_back追加内容
vector<int> v;
v.push_back(5);
v.push_back(5);
v.push_back(5);
v.push_back(5);
v.push_back(6);
for(auto x:v) cout<<x;
  • resize进行重置大小
v.resize(10);//不赋值默认为0
  • erase删除元素,复杂度为O(n)
v.erase(v.begin());//删除第一个元素
v.erase(--v.end());//删除最后一个元素
  • 获取第一个元素,获取最后一个元素
/**获取第一个元素*/
cout<<v.front();
cout<<v[0];
cout<<*v.begin();
/**获取最后一个元素*/
cout<<v.back();
cout<<v[v.size()-1];//size是获取大小
cout<<*--v.end();

4.排序

第三个参数为比较器,不写默认为less<int>()

vector<int> v{5,1,2,5,4,0,-1};
sort(v.begin(),v.end(),less<int>());//从小到大
sort(v.begin(),v.end(),greater<int>());//从大到小排序
for(auto x:v) cout<<x;

5.循环

vector<int> v{5,1,2,5,4,0,-1};
for(int i=0;i<v.size();i++) cout<<v[i];//for循环
cout<<endl;
for(vector<int>::iterator it=v.begin();it!=v.end();it++) cout<<*it;//迭代器循环
cout<<endl;
for(auto it=v.begin();it!=v.end();it++) cout<<*it;//迭代器简化循环
cout<<endl;
for(auto x:v) cout<<x;//c++11新特性

6、STL——stack(*)

概念:栈

  • 构造
stack<int> s;
  • push、pop、size、empty
  • push 入栈一个元素
  • pop 出栈一个元素,pop无返回值
  • top 取栈顶元素
  • size 查看元素个数
s.push(2);
s.push(3);
cout<<s.top()<<endl;
s.pop();
cout<<s.top()<<endl;
cout<<s.size()<<endl;
  • 进制转换(十进制转二进制)
int itob(int decimal){
    stack<int> s;int res=0;
    while(decimal!=0){
        s.push(decimal%2);
        decimal/=2;
    }
    while(!s.empty()){
        res=res*10+s.top();
        s.pop();
    }
    return res;
}
  • 逆序单词(拓展sstream,stoi,itoa)

输入一行字符串,将字符串逆序打印

输入:hello world my name is steve yu

输出:yu steve is name my world hello

#include <iostream>
#include <stack>
#include <sstream>

using namespace std;

int main(){
    string str;
    stack<string> s;
    getline(cin,str);
    stringstream ss;
    ss<<str;
    while(ss>>str)
        s.push(str);
    while(!s.empty()){
        cout<<s.top();
        s.pop();
        if(s.size()!=0) cout<<" ";
    }
    return 0;
}
  • 字符串转数字

方法1:

 string s="1234";
 int i;
 stringstream ss;
 ss<<s;
 ss>>i;
 cout<<i;

方法2:

string s="1234";
int i=stoi(s);
cout<<i;
  • 数字转字符串

方法1:

int a=1234;
string out;
stringstream ss;
ss<<a;
ss>>out;
cout<<out<<endl;

方法2:(c++ 11)

int a=1234;
cout<<to_string(a)<<endl;

7、STL——queue

概念:队列

  • 构造
queue<int> q;
  • push、back
q.push(5);
q.push(6);
cout<<q.front()<<endl;
q.pop();
cout<<q.front()<<endl;
cout<<q.size()<<endl;

8、STL——map(unordered_map pair)

概念:映射(map为树状表,unorderedmap为哈希表)

  • map
map<int,int> m;//有序的,树状结构(底层)
m[6]=3;
m[5]=8;
m[4]=9;
for(auto it=m.begin();it!=m.end();it++)
    cout<<it->first<<" "<<it->second<<endl;
for(auto tmp:m){
    cout<<tmp.first<<" "<<tmp.second<<endl;
}
  • unordered_map
unordered_map<int,int> m;//无序的,哈希结构(底层)
m[6]=3;
m[5]=8;
m[4]=9;
for(auto it=m.begin();it!=m.end();it++)
    cout<<it->first<<" "<<it->second<<endl;
for(auto tmp:m){
    cout<<tmp.first<<" "<<tmp.second<<endl;
}
  • pair的用法(map转成vector进行排序)
bool cmp(pair<int,int> a,pair<int,int> b){
    return a.first>b.first;
}
int main(){
    unordered_map<int,int> m;//无序的,哈希结构(底层)
    m[6]=3;
    m[5]=8;
    m[4]=9;
    vector<pair<int,int>> v(m.begin(),m.end());
    sort(v.begin(),v.end(),cmp);
    for(auto tmp:v){
        cout<<tmp.first<<tmp.second<<endl;
    }
    return 0;
}

9、set(unordered_set)

概念:集合

  • 应用计数、去重
set<int> s;//树状结构,有序
unordered_set<int> s2;//哈希结构,无序,快
s.insert(3);
s.insert(4);
s.insert(4);
s.insert(4);
cout<<s.size()<<endl;
for(auto tmp:s)
    cout<<tmp<<" ";
cout<<endl;
for(auto it=s.begin();it!=s.end();it++)
    cout<<*it<<" ";
cout<<endl;

10、STL——deque

概念:双端队列

deque<int> d;
// 4 9 1 2
d.push_back(1);
d.push_back(2);
d.push_front(9);
d.push_front(4);
d.pop_back();
d.pop_front();
for(auto tmp:d) cout<<tmp<<endl;
for(auto it=d.begin();it!=d.end();it++) cout<<*it<<endl;
  • 排序
sort(d.begin(),d.end(),greater<int>());

11、STL——list

概念:双向链表

list<int> li;
li.push_back(6);
li.push_front(5);
li.emplace_front(9);
li.emplace_back(10);
li.insert(++li.begin(),2);
for(auto tmp:li) cout<<tmp<<endl;
for(auto it=li.begin();it!=li.end();it++) cout<<*it<<endl;

12.文档

英文:

http://www.cplusplus.com/reference/stl/

中文:

http://c.biancheng.net/stl/map/

原文地址:https://www.cnblogs.com/littlepage/p/12113748.html

时间: 2024-08-06 13:19:31

STL常见用法的相关文章

C++STL常见用法(未完成

1.string(*) 概念:相当于char*的封装,理解为字符串 1.1.简单使用 /**C中定义字符串以及打印*/ char *ch="asdkajbf"; for(int i=0;ch[i]!='\0';i++) cout<<*(ch+i); /**C++中*/ string s="ssadaffw"; cout<<s<<endl; 1.2.获取一行字符串及长度 用cin读入字符串的时候,是以空格为分隔符的,如果想要读入一整

IOS中NSString的常见用法

iOS NSString的常用用法 //1.创建常量字符串. NSString *astring = @"This is a String!"; //2.创建空字符串,给予赋值. NSString *astring = [[NSString alloc] init]; astring = @"This is a String!"; //3.在以上方法中,提升速度:initWithString方法 NSString *astring = [[NSString allo

python之模块pprint之常见用法

# -*- coding: cp936 -*- #python 27 #xiaodeng #python之模块pprint之常见用法 import pprint data = [(1,{'a':'A','b':'B','c':'C','d':'D'}),(2,{'e':'E','f':'F','g':'G','h':'H','i':'I','j':'J','k':'K','l':'L'}),] print '--'*30 #1.打印效果 pprint.pprint (data) ''' ----

.NET中Path类的一些常见用法

.NET为处理文件路径提供了一个Path类,利用该类可以方便的处理文件路径,如更改文件后缀,合并文件路径,改变文件的扩展名等.有一点需要注意的是,Path类本质上是对一个字符串进行处理,更改的只是该字符串,而不会影响实际的文件.下面是该类的一些常见用法示例: 1 string filePath = @"C:\D\log\Receive\postedFile.txt"; 2 int padSpacesLength = 30; 3 string newFilePath = string.E

sscanf的常见用法

例子: 1. 常见用法. char buf[512] = ; sscanf("123456 ", "%s", buf); printf("%s\n", buf); 结果为:123456 2. 取指定长度的字符串.如在下例中,取最大长度为4字节的字符串. sscanf("123456 ", "%4s", buf); printf("%s\n", buf); 结果为:1234 3. 取到指定

正则表达式介绍及常见用法

正则表达式(Regular Expression),又称正规表示法.常规表示法,在实际的软件开发项目中经常会被使用到.它使用单个字符串来描述.匹配并获取一系列符合某个句法规则的结果. 我将从最基础的部分为大家写这个正则表达式教程. 正则表达式起源   1956年,数学家Stephen Kleene在Warren McCulloch和Walter Pitts早期神经系统工作的基础上,设计出了一个数学符号体系--regular sets(规则的集合),这个东西很快被计算机科学家用于编译器的扫描或词法

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map   list vector deque stack queue priority_queue set [unordered_set] map [unordered_map] multimap [unordered_multimap]     contiguous storage double-ended queue LIFO FIFO 1st is greatest  

python之模块poplib之常见用法

# -*- coding: cp936 -*- #python 27 #xiaodeng #python之模块poplib之常见用法 ''' 所以,收取邮件分两步: 第一步:用poplib把邮件的原始文本下载到本地: 第二部:用email解析原始文本,还原为邮件对象. poplib.POP3(host,port,timeout):连接pop3服务器 poplib.POP3_SSL(): POP3.set_debuglevel(level):设置调试模式,可以看到与服务器的交互信息 POP3.ge

【ORM】关于Dapper的一些常见用法

引言 Dapper是.Net平台下一款小巧玲珑的开源Orm框架,简单实用的同时保持高性能,非常适合我这种喜欢手写SQL的人使用,下面介绍一下如何使用Dapper. 相关资料 Dapper的GitHub地址是dapper-dot-net,上面有一些用法和性能的介绍,有兴趣者可以上去看看. 数据库设计和实体类     简单设计两个表,分别为部门表,雇员表. CREATE TABLE [dbo].[T_Dept] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Dept]