C++ STL详解(2)

点击蓝字

47210f1a0f14588acdfd0aa8671aa209.png

关注我们

来源自网络,侵删

刷题时常用的STL

string

之前写过一篇 string 的简介但是不是特别全面,这里再补充说明一下。

size()

 返回字符串中字符的数量

#include<iostream>
#include<string>using namespace std;int main() {string str = "AC-fun";cout << str.size();// 输出结果:6return 0;
}

clear()

 清空一个字符串

#include<iostream>
#include<string>using namespace std;int main() {string s = "string";cout << s;s.clear(); // 清空一个字符串 cout << endl;cout << "清空后字符串的长度为:" << s.size() << endl;cout << "清空后字符串的内容为:" << s;return 0;
}

操作符(Operators)

 你可以用 ==, >, <, >=, <=, != 比较字符串,可以用 + 或者 += 操作符连接两个字符串,并且可以用 [] 获取特定的字符。

compare()

 compare() 函数以多种方式比较本字符串和 str,按照 字典序 进行排序。使用 this 代表当前字符串,str 代表与 this 比较的字符串。那么如果“ this > str” 则 返回值大于零;如果“this = str ” 那么 返回值等于零;如果 “this < str ”那么 返回值小于零。此函数也有多种比较方式,下面分别进行介绍。

  • 比较自己 (this) 和 str

#include<iostream>
#include<string>using namespace std;int main() {string str1 = "aaa", str2 = "ab";if (str1.compare(str2) > 0) cout << "str1 > str2";else if (str1.compare(str2) == 0) cout << "str1 = str2";else cout << "str1 < str2";// 输出结果:str1 < str2 return 0;
}
  • 比较 自己的子串 和 str
     子串以 index 索引开始(从 0 开始),长度为 length。形式为:str1.compare(index, length, str2) 表示比较 str1 的子串与 str2 的大小。

#include<iostream>
#include<string>using namespace std;int main() {string str1 = "abcdef", str2 = "ef";int flag = str1.compare(4, 2, str2);if (flag) cout << "str1 > str2";else if (flag == 0) cout << "str1 = str2";else cout << "str1 < str2";// 输出结果:str1 = str2 return 0;
}

        •比较 自己的子串 和 str的子串

 比较形式为:str1.compare(index, length, str2, index2, length2)。其中    index2 和 length2 引用 str,index 和 length 引用str1。如果不写   index2   则 str2 的子串以索引 0 开始,长度为 length2,str1 的子串以     index 开始,长度为 length。

#include<iostream>
#include<string>using namespace std;int main() {string str1 = "abcdef", str2 = "abef";int flag = str1.compare(4, 2, str2, 2, 2);if (flag) cout << "str1 > str2";else if (flag == 0) cout << "str1 = str2";else cout << "str1 < str2";// 输出结果:str1 = str2 return 0;
}

substr()

 substr()返回本字符串的一个子串,从index开始,长num个字符。形式为:str.substr(index, length)。如果不写参数 length 或者参数 length 超过了 str 的长度,那么就将从 index 开始之后的所有字符输出。

#include<iostream>
#include<string>using namespace std;int main() {string str = "AC-fun";cout << str.substr(3, 3);// 输出结果:funreturn 0;
}

c_str()

 c_str() 函数返回一个指向正规 C 字符串的指针,即返回存储字符串的字符数组的起始地址。利用这个函数可以使用 printf() 函数来输出 string 字符串。

#include<iostream>
#include<string>
#include<cstdio>using namespace std;int main() {string str = "AC-fun";printf("%s", str.c_str());// 输出结果:AC-funreturn 0;
}

find()

 在字符串中查找字符串。此函数有三种重载方式。下面分别进行介绍。

str1.find(string str2, int index)

 返回 str2 在字符串 str1 中第一次出现的位置(从index开始查找)如果不写 index 参数,则直接从 str1 的开头开始查找。如果找到了返回 **str2 ** 第一次出现的位置(下标从 0 开始);如果没找到则返回 string::npos。对于 string::npos C++ 的官方文档对它的解释为:

 static const size_t npos = -1; npos是一个静态成员常量值,对于 size_t 类型的元素,该常量的最大值可能。该值在字符串成员函数中用作len(或sublen)参数的值时,表示“直到字符串结尾”。作为返回值,通常用于表示没有匹配项。该常量定义为值 -1,这是因为 size_t 是无符号整数类型,因此它是此类型可能的最大可表示值。

 因此,在判断字符串有没有时,可以直接判断是否等于 string::npos,也可以判断是否等于 -1

#include<iostream>
#include<string>
#include<cstdio>using namespace std;int main() {string str1 = "AC-fun", str2 = "fun", str3 = "good";if (str1.find(str2, 0) != -1) cout << "Yes" << endl;if (str1.find(str3, 0) == string::npos) cout << "No";// 输出结果:Yes//       Noreturn 0;
}
  • str1.find(char ch, int index)
     返回字符 ch 在字符串中第一次出现的位置(从 index 开始查找)。如果没找到就返回 string::npos

#include<iostream>
#include<string>
#include<cstdio>using namespace std;int main() {string str1 = "AC-fun";if (str1.find('-', 0) != -1) puts("Yes");else puts("No");// 输出结果:Yesreturn 0;
}

关于string的更多用法

 string还有很多函数,但是一般常用的函数就是以上提到的,想要学习更多用法请看:C++ API string

priority_queue

 priority_queue 优先队列总能 保证优先级最高的元素位于队头,最重要的原因是其底层采用 堆 数据结构存储结构。STL 的优先队列默认是 大根堆,即最大的元素总是位于队头。其操作方式与队列 queue 基本相同。优先队列的头文件也是 #include<queue>。时间复杂度为:O(nl o g n lognlogn)。

push()

 插入元素,并对底层容器排序。

#include<iostream>
#include<queue>using namespace std;int main() {priority_queue<int> heap;heap.push(1);heap.push(2);heap.push(3);// 使用 top() 访问堆顶元素cout << heap.top();// 输出结果:3 return 0;
}

top()

 访问堆顶元素。演示代码同 push()。

empty()

 检查底层的容器是否为空。若底层容器为空则为 true ,否则为 false 。

size()

 返回底层容器中的元素个数,即 heap.size()。

#include<iostream>
#include<queueusing namespace std;int main() {priority_queue<int> heap;heap.push(1);heap.push(2);heap.push(3);cout << heap.size(); // 输出结果:3 return 0;
}

pop()

 弹出堆顶元素。

#include<iostream>
#include<queue>using namespace std;int main() {priority_queue<int> heap;heap.push(1);heap.push(2);heap.push(3);cout << "当前堆顶元素为:" << heap.top() << endl; // 弹出堆顶元素 heap.pop();cout << "当前堆顶元素为:" << heap.top();return 0;
}

如何定义小根堆

 第一种方式是可以直接插入 -x,那么就可以直接利用大根堆创建了小根堆,输出的时候输出 -x 即可。
 第二种方式是使用 priority_queue 提供的方法。

#include<iostream>
#include<queue>
#include<vector>using namespace std;int main() {// 定义一个小根堆 priority_queue<int, vector<int>, greater<int> > heap; heap.push(1);heap.push(2);heap.push(3);cout << "当前堆顶元素为:" << heap.top() << endl; return 0;
}

堆排序

 堆是一棵 完全二叉树 ,可以使用数组模拟堆的实现。可以使用一维数组 h[] 来进行存储,对于根节点 x ,它的左儿子的下标为 x ∗ *∗ 2,右儿子的下标为 x ∗ *∗ 2 + 1。

    构建一个小跟堆其中最关键的一个函数就是 down() 函数。只要当前的根节点不是最小的元素那么就将其向下移动。直到当前的根节点是最小的元素。代码及主要思路如下:

void down(int u) {int t = u;//  找出根、左、右三个点做小的那个点if (2 * u <= cnt && h[2 * u] < h[t]) t = 2 * u; // 首先判断一下当前的根节点有没有左孩子,如果有判断一下根节点和左孩子的大小if (2 * u + 1 <= cnt && h[2 * u + 1] < h[t]) t = 2 * u + 1;// 然后再判断一下当前根节点有没有右孩子,如果有判断一下上一步比较出来的做小值和当前右孩子的值的大小if (u != t) {swap(h[u], h[t]);// 此时原来的元素 h[u] 就被换到了下标为 t 的数组中,所以继续 down(t)down(t);}
}

那么如何弹出栈顶元素呢?只要将第一个元素与最后一个元素交换,然后将指向堆中最后一个指针向前移动一个,再 down(1) 即可。这样就可以在删除时一直保证堆顶元素时最小的元素。

完整代码:

#include<iostream>
#include<cstdio>
#include<algorithm>using namespace std;const int N = 100010;
int n, m;
int h[N], cnt;  // 最好不要使用 size 作为变量,因为有的头文件里会有size函数,容易冲突void down(int u) {int t = u;//  找出根、左、右三个点做小的那个点if (2 * u <= cnt && h[2 * u] < h[t]) t = 2 * u; // 首先判断一下当前的根节点有没有左孩子,如果有判断一下根节点和左孩子的大小if (2 * u + 1 <= cnt && h[2 * u + 1] < h[t]) t = 2 * u + 1;// 然后再判断一下当前根节点有没有右孩子,如果有判断一下上一步比较出来的做小值和当前右孩子的值的大小if (u != t) {swap(h[u], h[t]);// 此时原来的元素 h[u] 就被换到了下标为 t 的数组中,所以继续 down(t)down(t);}
}int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) scanf("%d", &h[i]);cnt = n;for (int i = n / 2; i; i--) down(i);// 先输入再维护小根堆的时间复杂度为 O(n),而一边输入一边维护的时间复杂度为 Nlog(N)while (m--) {printf("%d ", h[1]);h[1] = h[cnt];cnt--;down(1);}return 0;
}

未完待续,持续更新中……

c97ef1667fa07c541efcd62232ca95f1.gif

如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

e7f756e24e4aa57de83fc3f454b42f15.gif

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

斐波那契数列的四种实现方式(C语言)

点击蓝字关注我们来源自网络&#xff0c;侵删斐波那契数列是一组第一位和第二位为1&#xff0c;从第三位开始&#xff0c;后一位是前两位和的一组递增数列&#xff0c;像这样的&#xff1a;0、1、1、2、3、5、8、13、21、34、55......今天&#xff0c;我们用四种方式来进行实现…

linux make命令_第一章 1.3Linux下安装Redis

1.3.2 Linux下安装Redis第一步: 去官网下载安装包 ,传送门第二步: 上传到Linux服务器,解压redis的安装包tar -zxvf redis-6.0.8.tar.gz这里我已经解压好了,并且移动到了redis目录下第三步: 安装基本环境yum -y insatll gcc-c这里注意一个问题,Centos下安装的gcc默认版本为4.8.5…

C语言strcpy函数的使用

点击蓝字关注我们strcpy简单使用&#xff1a; #include <stdio.h> #include <string.h>struct Student {int sid;char name[20];int age;} st; //此处分号不可省略int main(void) {struct Student st {1000,"zhangsan",20};printf("%d %s %d\n&…

什么镜头最适合拍风景_为什么您的风景摄影套件中应始终装有远摄镜头

当您考虑风景摄影镜头时&#xff0c;许多摄影师只考虑广角镜头。14-24mm f / 2.8或24-70mm f / 2.8等经典镜头是用于风景的流行光学元件。它们是绝佳的选择但是&#xff0c;也值得在风景摄影套件中使用长焦镜头。为什么要使用长镜头进行风景摄影&#xff1f;您在网上或浏览Inst…

C++ STL详解(3)

点击蓝字关注我们简介set 是 关联容器 的一种&#xff0c;是排序好的集合&#xff08;元素已经进行了排序&#xff09;。set 和 multiset 类似&#xff0c;它和 multiset 的差别在于 set 中不能有重复的元素。multiset 的成员函数 set 中也都有。使用 set 必须包含 #include<…

检测到基于堆栈的缓冲区溢出_检测到堆栈粉碎

检测到基于堆栈的缓冲区溢出我敢打赌&#xff0c;每个Java开发人员在他们的职业生涯开始时第一次遇到Java代码的本机方法时都会感到惊讶。 我还可以肯定&#xff0c;多年来随着了解JVM如何通过JNI处理对本机实现的调用而使惊奇消失了。 这篇文章是关于本机方法的最新经验。 更…

探讨 C++ 虚函数 virtual

点击蓝字关注我们来源于网络&#xff0c;侵删有无虚函数的对比C 中的虚函数用于解决动态多态问题&#xff0c;虚函数的作用是允许在派生类中重新定义与积累同名的函数&#xff0c;并且可以通过基类指针或引用来访问基类和派生类中的同名函数。首先写两个简单的类&#xff0c;类…

C++ STL详解(4)

点击蓝字关注我们来源于网络&#xff0c;侵删unordered_set / unordered_multiset这两个容器的方法与上一篇 C STL简介&#xff08;3&#xff09; 提到的 set / multiset 基本一样。但是要注意的是&#xff1a;这两个是无序的&#xff0c;基于哈希表实现的&#xff0c;增删改查…

js压缩图片_Web 性能优化: 图片优化让网站大小减少 62%

图像是web上提供的最基本的内容类型之一。他们说一张图片胜过千言万语。但是如果你不小心的话&#xff0c;图片大小有时高达几十兆。因此&#xff0c;虽然网络图像需要清晰明快&#xff0c;但它们尺寸可以缩小压缩的&#xff0c;使用加载时间保持在可接受的水平。在我的网站上&…

春春幼儿园堆积木大赛_春云边车

春春幼儿园堆积木大赛我有一个部署到基于NetflixOSS的云的应用程序&#xff0c;该应用程序具有以下结构&#xff1a; 本质上是一种将信息持久保存到Cassandra集群的服务。 所有应用程序都已注册到Eureka –因此&#xff0c;在本例中&#xff0c;该服务以及Cassandra节点都已在…

C++ 标准输入的行加速

点击蓝字关注我们来源于网络&#xff0c;侵删一、前言c/c 的标准输入函数&#xff0c;在输入一行数据&#xff0c;当数据量比较大的时候&#xff0c; cin 的效率是非常低的&#xff0c;为了加快读入的效率&#xff0c;可以改用 scanf&#xff0c;当然&#xff0c;还有一种利用 …

redis安装_Redis安装

redis安装本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外&#xff0c;您还会在Redis命令行上乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c…

C++ 自动锁

点击蓝字关注我们来源于网络&#xff0c;侵删一、锁1.锁 是 多线程编程 中一个很常用的概念&#xff0c;这里不多加介绍其原理&#xff0c;有兴趣可以参考 临界区 进行更多的了解&#xff1b;2.锁 一般会提供三个接口&#xff1a;加锁&#xff08;Lock&#xff09;、解锁&#…

C++ 浮点数精度判定

点击蓝字关注我们来源于网络&#xff0c;侵删一、引例看下下面这段代码&#xff0c;会输出什么结果呢&#xff1f;double x 0;for (int i 0; i < 10; i) {x 0.1;}printf("%d\n", x 1);输出如下&#xff1a;0引起这种反差的原因就是浮点误差&#xff0c;浮点数…

字节流和字符流哪个不刷新_不喜欢节流吗?

字节流和字符流哪个不刷新您别无选择–底层系统&#xff08;此处的JVM将为您完成选择&#xff09;。 我仍然记得2013年夏天&#xff0c;当时我正在运行一个项目&#xff0c;整个应用程序中只有1个URL使服务器瘫痪。 问题很简单-机器人决定以很高的速率索引我们的网站&#xff…

C/C++动态内存管理—(new与malloc)

点击蓝字关注我们来源于网络&#xff0c;侵删1.C/C内存分布虚拟地址空间分布&#xff1a;由C/C编译的程序占用的内存分为以下几个部分&#xff1a;栈区&#xff08;stack&#xff09;— 由编译器自动分配释放 &#xff0c;存放为运行函数而分配的局部变量、函数参数、返回数据、…

C++ sort()排序详解

点击蓝字关注我们来源自网络&#xff0c;侵删一.sort()简介1.为什么选择使用sort()我们经常会碰到排序的问题&#xff0c;如果我们不使用一些排序的方法那我们只能手撕排序&#xff0c;这样就会浪费一些时间。而且我们还需要根据需要去选择相关的排序方法&#xff1a;冒泡排序、…

性能测试流程_流性能

性能测试流程当我阅读Angelika Langer的Java性能教程时-Java 8流有多快&#xff1f; 我简直不敢相信&#xff0c;对于一个特定的操作&#xff0c;它们花费的时间比循环要长15倍。 流媒体性能真的会那么糟糕吗&#xff1f; 我必须找出答案&#xff01; 巧合的是&#xff0c;我最…

C++vector用法总结

点击蓝字关注我们来源自网络&#xff0c;侵删一.vector1. vector 说明1&#xff09;vector是C标准模板库中的部分内容&#xff0c;它是一个多功能的&#xff0c;能够操作多种数据结构和算法的模板类和函数库。2.&#xff09;vector之所以被认为是一个容器&#xff0c;是因为它能…

C++ STL 线性容器的用法

点击蓝字关注我们来源于网络&#xff0c;侵删1.vectorvector 是顺序容器的一种&#xff0c;是可变长的动态数组&#xff0c;支持随机访问迭代器&#xff0c;所有stl算法都能对 vector 进行操作。vector 容器在实现时&#xff0c;动态分配的存储空间一般都大于存放元素所需的空间…