STL常见用法

1 篇文章 0 订阅

C++常见STL用法

string

substr(size_t Off,size_t Count)

获取字符串从off位置开始长度位count的子串
对于字符串str="“David Beckham”", 如果要获取其中的字母串:

s.substr(2,str.length()-3);

结果为David Beckham

replace()和find()
如果要将某一行的所有"{{ abc }}"替换为str=“123”,可以这样做

int pos=s.find("{{ ");
while(pos!=std::npos){
	int epos=s.find(" }}");
	if(epos!=string::npos){
		int length=epos-pos+3;
		s=s.replace(spos,length,str);
	}
	pos=s.find("{{ ",pos+str.length()-1);
}

大小写转换函数

    transform(str.begin(),str.end(),str.begin(),::tolower);//toupper

vector

插入
iterator insert( iterator loc, const TYPE &val );
在位置loc之前插入值为val的数据。

vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
//在位置2前插入数值5
v.insert(v.begin()+2,5)

操作后v: 1253

查找
虽然vector不像map一样自带了find函数,但可以使用std的find函数用来查找某一数据。

v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<int>:: iterator it=std::find(v.begin(),v.end(),3);
cout<<*it<<endl;

结果输出为3。

有时候,如果需要查找的数据不是基本数据而是类、对象或者类中的某个成员变量,可以使用find_if函数。

#include<bits/stdc++.h>
using namespace std;
struct Point{
	int id;
	int x,y;
	Point(int id,int x,int y):id(id),x(x),y(y){
	}
	bool operator() (const Point &test){
		if(test.id==id)
			return true;
		return false;
	}
};
int main() {
	vector<Point> vp;
	vp.push_back({1,2,3});
	vp.push_back({2,3,4});
	vector<Point>::iterator it=std::find_if(vp.begin(),vp.end(),Point(1,0,0));
	if(it!=vp.end()) {
		cout<<"yes"<<endl;
	}
	
}

上面的代码会查找容器中的id为1的元素,最后结果查找成功,输出“yes”。
在这里重构函数operator()可以达到查找某个成员的目标(必须返回为bool且参数为const的对象引用)。

排序

sort(v.begin(),v.end());

注意区分不同容器的排序函数的写法

二维数组的初始化

vector<vector<int>> grid(10,vector<int>(8));
int line=grid.size();//二维数组的行数
int col=gird[0].size();//二维数组的列数

map

一、插入

map<string,string> mp;
mp.insert(std::pair<string,string>("abc","123"));
map<char,int>mp;//key为字符,value为字符出现的次数
//按照次数从大到小排列,如果次数相同,按照字符ASCII从小到大排序
vector<pair<char,int>>vec(mp.begin(),mp.end());
stable_sort(vec.begin(),vec.end(),[](const pair<char,int>& a,const pair<char,int>& b){
	return a.second>b.second;
	});//stable_sort函数实现在排序的同时不改变相对顺序,后面lamda的表达式方便比较pair
	for(auto& entry:vec)
		cout<<entry.second;

set

set插入insert时能自动实现字典排序并保证唯一性。

list

list和vector相比,在涉及到大量数据的添加和删除时,如果使用vector造成代码超时,则考虑改为list(参考CSP201812-3 CIDR合并
基本操作

l.sort();
l.unique();//去重
bool cmp( &, &){..};//用于修改排序比较的方式
list<int>::iterator it=l.begin();
it=l.erase(it);//删除迭代器当前元素后,必须重新赋值迭代器,否则迭代器失效
//插入前l: 1 2 3 4 5  it指向3
l.insert(it,6);//1 2 6 3 4 5  it仍然指向3
l.insert(it,7);//1 2 6 7 3 4 5 it仍谈指向3
l.insert(it--,8);//此代码执行后,it指向7而不是新插入的8
//因此如果要指向新插入的元素,必须在插入的代码后面单独添加--it;的代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值