STL再回顾(非常见知识点)
为人熟知的pair类型
注意:pair对于==, !=, <, >, <=, >=
进行了重载,提供first第一关键字,second第二关键字的比较方法。
再谈STL
STL有三大件:
- 容器
- 算法
- 迭代器
迭代器的使用
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> myv;
myv.push_back(1);
myv.push_back(2);
myv.push_back(3);
vector<int>::iterator it;
for(it = myv.begin(); it != myv.end(); it++)
{
cout << *it << " ";
}
puts("");
vector<int>::reverse_iterator rit;
for(rit = myv.rbegin(); rit != myv.rend(); rit++)
{
cout << *rit << " ";
}
return 0;
}
常用的STL容器
顺序容器
有四个vector, string, deque, list
vector(向量)
优点:
- 可以在末尾快速插入以及删除
- 支持随机访问
缺点:
- 在中间插入或者删除像 数组 一样,移动大量元素
- 当大小不够时,按照两倍大小重新分配,并且移动。
构造方式
#include <vector>
#include <iostream>
using namespace std;
#define V v4 //更改这里可以查看不同效果!
vector<int> v1;
vector<int> v2(20);//指定了初始的size为20,再执行push_back是从21开始!!前面的20个元素的值是0
vector<int> v3(20, 2);//指定了初始的size为20,再执行push_back是从21开始!!前面的20个元素的值是2
int a[] = {1, 2, 3, 4};
vector<int> v4(a, a+4);//从数组中获取
int main()
{
for(int i = 1; i <= 100; i++)
{
V.push_back(i);
printf("%dsize:%d, cap:%d\n",i, V.size(), V.capacity());
}
for(int i = 0; i < V.size(); i++)
cout << V[i] << " ";
return 0;
}
拥有的常用的成员函数(java人称方法)
常用的仅仅列举 不说明!
empty()
size()
[]
reserve(n)
分配n个元素的存储空间
注意:这一个仅仅是修改一开始的capacity,不影响size
使用可以直接给定一个空间,避免空间不够而进行频繁增加删除,当做更加优秀的数组使用
capacity
resize()
调整size,比原来小时,删除多余的;比原来大时,补0
push_back()
insert(pos, elem)
把某一个值插入到pos之前(注意这要耗费许多时间!)
pos是迭代器!
front()
获取第一个值
back()
获取最后一个值
erase()
有重载:
- 一个参数,迭代器,删除这一个位置元素
- 两个迭代器,删除后这两个迭代器的区间中的元素。
clear()
begin(), end(), rbegin(), rend()
string
构造方式
string()
string(char*)
string(string)
成员函数
empty()
size()
length()
貌似除了类型与上面的有区别,其他的没有区别
[]
at()
和上面一样
compare(const string &str)
比较
如果自己大,返回1,形参大,返回-1,否则返回0
append(const string &str)
在末尾增加字符串
insert(pos, elem)
把某一个值插入到pos之前(注意这要耗费许多时间!)
pos可以是迭代器,也可以是数字!
但是elem一定是字符串!
find(字符或字符串, 位置)
注意:如果找不到,返回值是一个迷,所以尽量不要用
replace()
例子:
string s1("abcdefg");
string s2(s1);
s1.replace(3, 3, "lll");//起始位置,长度,替换内容
cout << s1;
string::iterator it1 = s2.begin()+1;
string::iterator it2 = s2.end()-1;
s2.replace(it1, it2, "11");//[ , )
cout << s2 ;
substr
并不改变原来的值
string s1("abcdefg");
cout << s1.substr(3) << "\n";//defg
cout << s1.substr(3, 3);//def
clear(), erase
清空。
erase(idx);
从idx(数字)处删除之后的内容
erase(idx, len)
从idx(数字)处删除之后的长度为len内容
deque
deque
与vector相比,他并不是由一个整体的内存存储的,而是由多个连续的内存块存储的,所以在头部以及尾部插入元素比较快,并且也支持随机访问。
构建方式:
#include <deque>
#include <iostream>
using namespace std;
#define DQ dq3
int main()
{
deque<int>dq1;
deque<int>dq2(2);
deque<int>dq3(2, 3);
deque<int>dq4(dq1);
deque<int>dq5(dq1.begin(), dq1.end());
deque<int>::iterator it;
DQ.push_back(8);
DQ.push_front(0);
for(it = DQ.begin(); it != DQ.end(); it++){
cout << *it;
}
return 0;
}
empty()
size()
front()
back()
push_front()
pop_front()
push_back()
pop_back()
erase()
清除一个或者几个值
clear()
全部清除
begin(), end(), rbegin(), rend()
list
可以快速插入以及删除元素,但是不支持随机访问。
empty()
size()
push_front()
pop_front()
push_back()
pop_back()
remove
Removes every element in the list equal to value.
list<int> l1({1, 2, 3, 4, 4, 4});
l1.remove(4);
list<int>::iterator it;
for(it = l1.begin(); it != l1.end(); it++)
{
cout << *it << " ";//1 2 3
}
remove_if()
#include <list>
#include <iostream>
using namespace std;
#define DQ dq3
bool judge(int val)
{
return val&1;
}
int main()
{
list<int> l1({1, 2, 3, 4, 5, 6});
l1.remove_if(judge);
list<int>::iterator it;
for(it = l1.begin(); it != l1.end(); it++)
{
cout << *it << " ";//2 4 6
}
return 0;
}
erase()
删除一个或者几个元素
clear()
清除所有的元素
insert(pos, n, elem), insert(pos, elem)
注意:这一个插入是瞬间完成的。
insert(pos, 迭代器开始, 迭代器结束)
由于STL中的某些算法处理的是顺序容器的,所以在list中额外提供了一些功能。
#include <list>
#include <iostream>
using namespace std;
list<int>::iterator it;
int main()
{
list<int> l1({1, 3, 5, 7, 9, 11});
list<int> l2({2, 4, 6, 8, 10, 11});
l1.merge(l2);//************************************
for(it = l1.begin(); it != l1.end(); it++)
{
cout << *it << " ";
}
puts("");
l1.reverse();//************************************
for(it = l1.begin(); it != l1.end(); it++)
{
cout << *it << " ";
}
puts("");
l1.sort();//************************************
for(it = l1.begin(); it != l1.end(); it++)
{
cout << *it << " ";
}
puts("");
l1.unique();//************************************
for(it = l1.begin(); it != l1.end(); it++)
{
cout << *it << " ";
}
puts("");
return 0;
}
关联容器
set/multiset
set
:集合容器
multiset
:多重集合容器
元素值就是关键字
优点
- 默认进行了排序。
- 可以快速插入,删除,查询(全部是logN)。
- 支持集合的交,差,并
成员函数
empty()
size()
insert()
erase()
查找元素并且删除(返回值为删除了的元素的个数(在multiset中可能大于1))
clear()
count
返回关键字出现的次数
find()
如果存在,返回迭代器,否则返回end()
upper_bound()
第一个大于num的数字
lower_bound()
第一个大于或等于num的数字
begin(), end(), rbegin(), rend()
集合的交集,并集,差集
#include <list>
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
list<int>::iterator it;
int main()
{
set<int> s1({1, 2, 3, 4, 5, 6, 7, 8});
set<int> s2({5, 6, 7, 8, 9, 10});
vector<int> ret;
//一定要设置大小!
ret.resize(max(s1.size(), s2.size()));
vector<int>::iterator tmp = set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), ret.begin());
ret.resize(tmp - ret.begin());
//重新设置大小
for(vector<int>::iterator it = ret.begin(); it != ret.end(); it++)
{
cout << *it << " ";
}
return 0;
}
set_intersection //求两个容器的交集
set_union //求两个容器的并集
set_difference //求两个容器的差集
map/multimap
注意:map/multimap中的元素是以pair<>
进行存储的。
map/multimap的区别
map的key不允许重复,可以使用[]
multimap的key允许重复,不可以使用[]
主要的成员函数
empty()
size()
XX[key]
- 如果存在key,那么就可以进行引用以及赋值;
- 但是如果不存在key,那么就会新创建一个key然后插入。
insert(make_pair() 或者 {__, __})
erase()
multimap<int, int> mp;
mp.insert({1, 2});
mp.insert({1, 3});
mp.insert({1, 4});
int ret = mp.erase(1);
cout << ret;
当然里面也可以是迭代器!
clear()
count()
返回指定关键字的数量
find()
查找关键字(如果是Multimap,那么就会返回第一个关键字)
tip:利用find和count就可以找到multimap中的所有的key值元素
哈希容器:
unorder_map/multimap、unorder_set/multiset
基本的使用与上面的是相同的
- 但是就是没有排序也不能进行集合的运算。
- 会占用较大的空间
- 访问的速度也将大大提升
适配器容器
概述
一般情况下,
stack:deque(常规),list,vector
queue:deque(常规),list
priority_queue:vector(常规),deque
手动指定:
stack<int, deque<int> >s;//默认
stack<int, list<int> >s;
stack<int, vector<int> >s;
queue<int, deque<int> >q;//默认
queue<int, list<int> >q;
priority_queue<int, vector<int> >q;//默认
priority_queue<int, deque<int> >q;
stack
具有
empty()
size()
push
pop
top
queue
具有
empty()
size()
push
pop
front
back
priority_queue
empty()
size()
push
pop
top
关系函数对象
头文件:#include<functional>
greater<>
less<>
相关练习
分隔单词
输入一堆单词,分割单词(没有标点符号)
#include <bits/stdc++.h>
using namespace std;
void Divide(const string &str, vector<string> &vec)
{
int i, j;
i = 0;
j = str.find(" ");
while(j != -1)
{
vec.push_back(str.substr(i, j-i));
i = j+1;
j = str.find(" ", i);
}
if(i < str.length())
{
vec.push_back(str.substr(i));
}
}
int main()
{
char buf[100];
fgets(buf, 100, stdin);
string str = string(buf);
str.erase(str.find("\n"));
vector<string> vec;
Divide(str, vec);
for(int i = 0; i < vec.size(); i++)
cout << vec[i] << "\n";
return 0;
}
STL再回顾(非常见知识点)的更多相关文章
- mysql常见知识点总结
mysql常见知识点总结 参考: http://www.cnblogs.com/hongfei/archive/2012/10/20/2732516.html https://www.cnblogs. ...
- T100 GR 报表常见知识点 (含套版制作)
轉載至赫非域 > T100 GR 报表常见知识点 前端操作 bron1984 7小时前 5浏览 0评论 8.9.1 注意事项 字体: 如果字型没选对,会造成没设对字型的数据汇出 PDF 格式乱掉 ...
- Java 基础常见知识点&面试题总结(下),2022 最新版!
你好,我是 Guide.秋招即将到来,我对 JavaGuide 的内容进行了重构完善,同步一下最新更新,希望能够帮助你. 前两篇: Java 基础常见知识点&面试题总结(上),2022 最新版 ...
- MySQL 锁常见知识点&面试题总结
节选自 <MySQL 常见知识点&面试题总结> 表级锁和行级锁了解吗?有什么区别? MyISAM 仅仅支持表级锁(table-level locking),一锁就锁整张表,这在并发 ...
- CompTIA Security+ 常见知识点
前言: Security+ 认证是一种中立第三方认证,其发证机构为美国计算机行业协会CompTIA: 是和CISSP.CISA等共同包含在内的国际IT业热门认证之一,和CISSP偏重信息安全管理相比, ...
- Java 基础常见知识点&面试题总结(中),2022 最新版!| JavaGuide
你好,我是 Guide.秋招即将到来,我对 JavaGuide 的内容进行了重构完善,公众号同步一下最新更新,希望能够帮助你. 上篇:Java 基础常见知识点&面试题总结(上),2022 最新 ...
- Java 集合常见知识点&面试题总结(上),2022 最新版!
你好,我是 Guide.秋招即将到来(提前批已经开始),我对 JavaGuide 的内容进行了重构完善,公众号同步一下最新更新,希望能够帮助你. 你也可以在网站(javaguide.cn)上在线阅读, ...
- iOS 常见知识点(三):Lock
iOS 常见知识点(一):Runtime iOS 常见知识点(二):RunLoop 锁是最常用的同步工具.一段代码段在同一个时间只能允许被有限个线程访问,比如一个线程 A 进入需要保护代码之前添加简单 ...
- HTML+CSS+js常见知识点
一.HTML.CSS常见知识点 1.垂直居中盒子 /* 方法一 */ html, body { width: 100%; height: 100%; padding: 0; margin: 0; } ...
随机推荐
- ansible部署java及数据库环境
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.rpm wget https://artif ...
- RPA应用场景-信用卡交易争议后续流程
RPA应用场景-信用卡交易争议后续流程 场景概述 信用卡交易争议后续流程 所涉系统名称 客服系统,邮件 人工操作(时间/次) 4小时 所涉人工数量20操作频率 不定时 场景流程 1.RPA自动接收客户 ...
- Java开发学习(八)----IOC/DI配置管理第三方bean、加载properties文件
前面的博客都是基于我们自己写的类,现在如果有需求让我们去管理第三方jar包中的类,该如何管理? 一.案例:数据源对象管理 本次案例将使用数据源Druid和C3P0来配置学习下. 1.1 环境准备 学习 ...
- 腾讯云原生数据库TDSQL-C架构探索和实践
作为云原生技术先驱,腾讯云数据库内核团队致力于不断提升产品的可用性.可靠性.性能和可扩展性,为用户提供更加极致的体验.为帮助用户了解极致体验背后的关键技术点,本期带来腾讯云数据库专家工程师王鲁俊给大家 ...
- 揭开服务网格~Istio Service Mesh神秘的面纱
目录 一.写在前面 二.微服务与K8S 三.服务网格与K8S 四.常见的产品 五.Istio架构 六.Istio的核心资源介绍 6.1.VirtualService 6.2.Destination R ...
- Node.js精进(11)——Socket.IO
Socket.IO 是一个建立在 WebSocket 协议之上的库,可以在客户端和服务器之间实现低延迟.双向和基于事件的通信. 并且提供额外的保证,例如回退到 HTTP 长轮询.自动重连.数据包缓冲. ...
- java------注释、关键字、字面量
注释(对代码的一种解释说明) 单行注释 // 多行注释 /* */ 文档注释 /** */ 注释使用细节: 注释内容不参与编译和运行,所以只在java文件中存在 不管是单行注释还是多行注释 ...
- 关于奇妙的 Fibonacci 的一些说明
奇妙的 Fibonacci,多次模拟赛中出现 同时也是 BZOJ 2813 一 Fibonacci 的 GCD 如果 \(F\) 是 Fibonacci 数列,那么众所周知的有 \(\gcd(F_i, ...
- YII学习总结5(视图)
<?php namespace app\controllers; use yii\web\Controller; class HelloController extends Controller ...
- mui 登录跳转到首页之后顶部选项卡不灵敏问题
前段时间开发一个用mui开发app的时候遇到了登录跳转到首页之后顶部选项卡会失灵的问题,多次尝试之后终于解决了,趁现在还有点印象记录一下吧. 一开始我是用mui.openWindow来新开首页的,出了 ...