瞅一眼 c++ STL

1 篇文章 0 订阅

STL

1、STL基本概念

STL,即C++的标准模板库。

STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。三个核心组件:容器、算法、迭代器.

容器: 各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种类模板。
算法: 各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种函数模板.
迭代器: Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。 共5种类型。

仿函数: 仿函数是重载operator()的class对象,因为其行为类似于函数,所以称作仿函数。它也叫做函数对象。

配接器: 一种用来修饰容器或仿函数或迭代器接口的东西。配接器在STL组件的灵活组合运用功能上扮演着轴承、转换器的功能。

配置器 : 负责空间配置与管理,从实现的角度看,配置器是一个实现了动态空间配置、空间管理,空间释放的class template。

2、字符串:string

2.1 简单使用

/**构造**/
string s1;//创建空字符串

const char* str = "hello world";
string s2(str);//使用字符指针str初始化
cout <<"s2="<< s2 << endl;

string s3(s2);//使用一个string对象初始化另一个string对象
cout << "s3=" << s3 << endl;

string s4(10, 'a');//使用n个字符初始化
cout << "s4=" << s4 << endl;

/**赋值(assign)**/
1.=运算符
2.assign函数

/**字符串拼接(append)**/
1. +=运算符
2.append函数


/**字符串的比较**/
逐一比较每个字符的ASCII,若全部相等,返回0,若str1的ASCII大于str2则返回1,否则返回-1

2.2 字符串存取

at()函数

2.3 erase函数(删除)

/**begin是头迭代器,end是尾迭代器*/
string s="5418340";
s.erase(s.begin());//删除第一个
s.erase(--s.end());//删除最后一个
cout<<s;

2.4 insert函数(插入)

string str1 = "hello";
str1.insert(1, "big");//在某个位置插入
cout << str1 << endl;

2.5 substr函数(获取)

复制子字符串,要求从指定位置开始,并具有指定的长度

/**begin是头迭代器,end是尾迭代器*/
string s="5418340";
s=s.substr(1,3);//取418,取索引为1,往后截断3个
s=s.substr(1,-1);//索引为1,截断到最后
cout<<s;

迭代器

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

cout<<*it;

化简:

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

C++11的新特性

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

3、不定长数组:vector

vector和普通数组的区别:数组是静态空间,而vector可以动态扩展

3.1 初始化vector

3.2 vector的赋值

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

3.3 用at或者[]获取元素

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

3.4 vector的插入和删除

push_back()//尾部插入元素
pop_back()//尾部删除元素
insert(pos,ele)//向指定的索引位置插入元素
insert(pos,n,ele)//向指定的索引位置插入n个元素
erase(pos)//删除指定索引的元素
erase(start,end)//删除start到end之间的元素
clear()//清空容器

3.5 vector数据存取

front()//第一个元素
back()//最后一个元素

3.6 其他

重置大小:resize()
v1.resize(10);

size();//获取大小

4、集合:set

1)set中的元素都是排好序的

2)set集合中没有重复的元素

4.1 构造

4.2 赋值

4.3 大小和交换

s.size();//获取大小
s.empty();//判断为空?
s.swap();//交换

4.4 插入和删除

insert(ele);
clear();
erase(pos);
erase(beg,end);
erase(ele);

4.5 查找、统计

find(key);//查找key是否存在,若存在,则返回该键元素的迭代器,若不存在,则返回set.end();
count(key);//统计key的个数

4.6 对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;

5、映射:map

关联数组

m.insert()//插入

m.erase()//删除

size();

empty();

clear()//清空

6、栈:stack

img

push();//入

pop();//出栈

top();

7、队列:queue

只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作

img


push();

pop();

front()//队首

back()//队尾

8、链表:list


list<int> li; 

li.push_back(6); //末尾添加元素

li.pop_font();//删除开头元素

li.push_front(5); //开头添加元素





li.emplace_front(9); //开头添加元素

li.emplace_back(10); //末尾添加元素

li.insert(++li.begin(),2); //插入,与vector一样

for(auto tmp:li) cout<<tmp<<endl; 

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

9、排序与检索:sort

sort 升序、降序

a,n个元素

sort(a,a+n)

sort(a.begin(),a.end(), compare())

例1-1 *

现有一个数列a,包含了N个非负整数。要求你先把这些数从小到大排序,然后会对你进行Q次询问,每次询问都会问你此数列中是否存在整数x。若存在,请输出整数x在序列中第一次出现的位置(位置从1开始),否则输出“No Found”。

//a数组里一个指定的元素

sort()

lower_bound((a,a+n,x)-a) ; //查找>=x的第一个位置

输入格式:

第一行输入两个整数N和Q,分别表示有N个非负整数和进行了Q次询问。第二行输入N个非负整数。接下来输入Q个整数,分别表示第i次询问中所问的数字x。

输出格式:

对每个样例,输出Q行数字,对每行的输出,若数列中存在整数x,输出x在序列中的位置(位置从1开始),否则输出“No Found”。

样例输入:

4 1
2 3 5 1
5
5 2
1 3 3 3 1
2 3

样例输出:

4

no found
3

分析:

使用algorithm头文件中的sort和lower_bound。


#include<bits/stdc++.h>
using namespace std;
//数列a
const int maxn=1e5;
int a[maxn];

int main() {
	int q,x,n;

	cin>>n>>q;
	for(int i=0; i<n; i++) {
		cin>>a[i];//输入数列a
	}

	sort(a,a+n);//从小到大排序

	while(q--) {
		cin>>x;

		int pos=lower_bound(a,a+n,x)-a; //查找x

		if(a[pos]==x) {
			cout<<pos+1;//输出位置
		} else {
			cout<<"No Found"<<endl;

		}
	}
}

逆序单词

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

输入:hello world my name is dyx

输出:dyx is name my world hello

push()//入

pop()//出


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

int main() {
//string + 栈
 
string str;
stack<string>s;//栈 
getline(cin,str);//输入str
stringstream ss;//对字符串输入输出操作(输入输出流) 
ss<<str;

while(ss>>str)
{
	s.push(str);//入栈
 } 
 while(!s.empty())//判断是否栈空 
 {
 	cout<<s.top();//输出栈顶元素 
 	s.pop();//出栈 
	 if(s.size()!=0) 
	 cout<<" "; 
  } 
 
}

12、 merge 、 reverse 等等

练习:

s name my world hello

push()//入

pop()//出


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

int main() {
//string + 栈
 
string str;
stack<string>s;//栈 
getline(cin,str);//输入str
stringstream ss;//对字符串输入输出操作(输入输出流) 
ss<<str;

while(ss>>str)
{
	s.push(str);//入栈
 } 
 while(!s.empty())//判断是否栈空 
 {
 	cout<<s.top();//输出栈顶元素 
 	s.pop();//出栈 
	 if(s.size()!=0) 
	 cout<<" "; 
  } 
 
}

STL容器参考手册(翻译):https://www.cnblogs.com/barney-li/p/4186681.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值