从C语言的使用转换到C++(下篇)——刷题、竞赛篇

news2024/12/25 4:00:46

 

目录

一、C++STL的简介

二、STL的使用详解 

2、1 STL之动态数组vector的使用

2、2 STL之集合set的使用

2、3 STL之映射map的使用

2、4 STL之栈stack的使用

2、5 STL之队列queue的使用

2、6 STL之unordered_map和unordered_set的使用 

三、总结


标题:从C语言的使用转换到C++(下篇)——刷题、竞赛篇

作者:@Ggggggtm

寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景

  我们上篇文章讲述了C++中的一些基础语法和常用函数(从C语言的使用转换到C++(上篇)——刷题、竞赛篇),我们本篇文章讲述C++STL的使用。

一、C++STL的简介

  STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。
  STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组;
  STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效。

二、STL的使用详解 

2、1 STL之动态数组vector的使用

  在c语言中我们学习了数组的使用,如:int arr[10]。我们在使用的过程中也发现其缺点,我们不能随意的改变数组的长度。在C++中我们可以使用动态数组vector来完全代替c语言中的数组。动态数组vector能够在运行阶段设置数组的长度、在末尾和中间插入数据、长度可以任意改变。相对c语言中的数组来说,动态数组vector很方便、很实用。

  动态数组vector在头文件vector中,也在命名空间std里面。所以使用动态数组vector时,我们要引入#include<vector>和using namespace std;

  vector、stack、queue、map、set 这些在C++中都叫做容器,这些容器的大小都可以用.size()获取到。我们快来看一下具体的使用方法:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> v1;  //定义一个的整形动态数组vector v1,定义的时候并没有分配大小
	cout << v1.size() << endl;  //输出动态数组vector v1的大小
	return 0;
}

  在上面的代码中,我们简单的定义了动态数组vector,并且计算了其大小。注意:动态数组vector在C++中叫做容器,我们可以用.size()来计算出其大小。

  上述我们在定义的时候并没有分配大小,所以用.size()来计算出其大小时,结果为0。  我们接着看动态数组vector的其他用法:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	//vector<int> v1;  //定义一个的整形动态数组vector v1,定义的时候并没有分配大小
	//cout << v1.size() << endl;  //输出动态数组vector v1的大小

	vector<int> v(10);  //直接定义长度为10的int数组,默认每个元素的值为0

	vector<int> v1;
	v1.resize(8);  //先定义了一个vector v1的动态数组,然后再用resize设置长度为8

	vector<int> v2(100, 9);  //把长度为100的数组的所有值都初始化为9

	v[1] = 2;  //可以直接用下标来访问,也可用迭代器访问
	return 0;
}

  不管是vector 、 stack 、 queue 、 map还是set 都有很多好用的方法,这些方法都可以在www.cplusplus.com官方网站中直接查询官方文档,上面有方法的讲解和代码示例。比如进入官网搜索 vector ,就会出现 vector拥有的所有方法,点进去一个方法就能看到这个方法的详细解释和代码示例~当然我们平时写算法用不到那么多方法啦,只有几个是常用的。以下是一些常用的 vector方法:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> a; //定义时不指定vector的大小
	cout << a.size() << endl; // a的大小为0
	for (int i = 0; i < 10; i++) 
	{
		a.push_back(i); // 向a中末尾插入0到9
	}
	cout << a.size() << endl; // a的大小为10;
	vector<int> b(15);  //定义时指定b的大小为15,各个元素默认值为0
	cout << b.size() << endl;  //b的大小为15
	for (int i = 0; i < b.size(); i++) 
	{
		b[i] = 15;  //给b中的每个元素赋值
	}
	for (int i = 0; i < b.size(); i++) 
	{
		cout << b[i] << " ";  //输出b中的元素
	}
	cout << endl;
	vector<int> c(20, 2);  //定义时指定c的大小为20,各个元素默认值为2
	for (int i = 0; i < c.size(); i++) 
	{
		cout << c[i] << " ";  //输出c中的元素
	}
	cout << endl;
	for (auto it = c.begin(); it != c.end(); it++)   //迭代器访问
	{
		cout << *it << " ";
	}
	return 0;
}

  容器vector , set , map这些遍历的时候都是使用迭代器访问的,(c.begin()是一个指针,指向容器的第一个元素,c.end()指向容器的最后一个元素的后一个位置)。

  上述代码的运行结果如下图:

2、2 STL之集合set的使用

  set是集合,一个 set里面的各元素是各不相同的,而且 set 会按照元素进行从小到大排序。以下是set的常用用法:

#include <iostream>
#include <set>
using namespace std;
int main()
{
	set<int> s;  //定义一个集合
	s.insert(1);  //向集合里面插入一个1
	cout << *(s.begin()) << endl; // ᬌ输出集合中的第一个元素
	for (int i = 0; i < 10; i++) 
	{
		s.insert(i); // 向集合中插入十个元素
	}
	for (auto it = s.begin(); it != s.end(); it++) 
	{
			cout << *it << " ";
	}
	cout << endl << (s.find(2) != s.end()) << endl; //查找集合s中的值,如果结果等于s.end()表示未找到(因为s.end()表示s的最后一个元素的下一个元素所在的位置)
		cout << (s.find(10) != s.end()) << endl; // s.find(10) != s.end()
	s.erase(1); // s.erase( 1);//删除集合s中的1这个元素
	cout << (s.find(1) != s.end()) << endl; //这时候元素1就应该找不到了
	return 0;
}

  上述代码的运行结果如下图:

2、3 STL之映射map的使用

  map是键值对,比如一个人名对应一个学号,就可以定义一个字符串string类型的人名为“键”,学号int类型为“值”,如map<string, int>m;当然键、值也可以是其它变量类型。map 会自动将所有的键值对按照键从小到大排序,map使用时的头文件 #include <map>以下是 map中常用的方法:

#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
	map<string, int> m;  //定义一个空的map m,键是string类型的,值是int类型的

	m["hello"] = 2;   //将key为"hello", value为2的键值对(key-value)存入map中
	cout << m["hello"] << endl;  //访问map中key为"hello"的value,如果key不存在,则返回0
	cout << m["world"] << endl;  //返回0

	m["world"] = 3;  //将"world"键对应的值修改为3
	m[","] = 1;  //设立一组键值对,键为",”值为1
	

	for (auto it = m.begin(); it != m.end(); it++) 
	{
		//用迭代器遍历,输出map中所有的元素,键用it->first获取,值用it->second获取
		cout << it->first << " " << it->second << endl;  
	}
	//访问map的第一个元素,输出它的键和值
	cout << m.begin()->first << " " << m.begin()->second << endl;

	//访问map的最后一个元素,输出它的键和值
	cout << m.rbegin()->first << " " << m.rbegin()->second << endl;

	//输出map的元素个数
	cout << m.size() << endl;
	return 0;
}

  上述代码的运行结果如下图:

2、4 STL之栈stack的使用

  栈stack在头文件 #include <stack>中,是数据结构里面的栈。我们知道栈是先进后出的一个原则。以下是常用用法:  

#include <iostream>
#include <stack>
using namespace std;
int main() 
{
	stack<int> s;  //定义一个空栈s
	for (int i = 0; i < 6; i++) 
	{
		s.push(i);  //将元素i压入栈s中
	}
	cout << s.top() << endl;  //访问s的栈顶元素
	cout << s.size() << endl;  //输出s的元素个数
	s.pop(); //移除栈顶元素
	cout << s.size() << endl;  //输出s的元素个数
	cout << s.top() << endl;  //访问s的栈顶元素
	return 0;
}

   上面代码的运行结果如下图:

2、5 STL之队列queue的使用

  队列queue 在头文件 #include<queue>中,是数据结构里面的队列。队列遵循先进先出的原则。以下是常用用法:

#include <iostream>
#include <queue>
using namespace std;
int main() 
{
	queue<int> q;  //定义一个空队列q
	for (int i = 0; i < 10; i++) 
	{
		q.push(i);  //将i的值依次压入队列q中
	}
	cout << q.front() << " " << q.back() << endl;  //访问队列的队首元素和队尾元素
	cout << q.size() << endl;  //输出队列的元素个数
	q.pop();  //移除队列的队首元素
	cout << q.front() << endl;
	cout << q.size() << endl;  //输出队列的元素个数
	return 0;
}

  上述代码的运行结果如下图:

2、6 STL之unordered_map和unordered_set的使用 

  unordered_map在头文件#include<unordered_map>中,unordered_set 在头文件#include<unordered_set>中。unordered_map和 map(或者unordered_set和 set )的区别是,map 会按照键值对的键 key进行排序(set里面会按照集合中的元素大小进行排序,从小到大顺序),而unordered_map(或者unordered_set)省去了这个排序的过程,如果偶尔刷题时候用map或者set 超时了,可以考虑用unordered_map(或者_unordered_set)缩短代码运行时间、提高代码效率。至于用法和map .set是一样的。

三、总结

  学到这里我们发现,用C++来刷题确实会方便很多。例如,STL中已有栈、队列等容器。而c语言却没有,有些题目做起来就麻烦了很多。

  STL的使用给我们带来了很大的便利,也是哦我们重点掌握的内容。学到这里基本上用C++写算法题没有问题。我们需要做的就是通过刷题,进而更加熟练的掌握。

  希望以上内容对你有所帮助,感谢阅读ovo~

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

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

相关文章

还不会SpringBoot项目模块分层?来这手把手教你

文章目录前言&#x1f34a;缘由⏲️本文阅读时长&#x1f3af;主要目标&#x1f468;‍&#x1f393;试用人群&#x1f381;快速链接&#x1f369;水图正文&#x1f96b;1.IDEA新建项目&#x1f32d;2.创建子模块-dependencies(依赖层)&#x1f3af;重点&#x1f36a;3.创建子模…

【寒假小练】day2

前言 日积跬步&#xff0c;能至千里。 水平有限&#xff0c;不足之处望请斧正。 选择题 1、以下程序运行后的输出结果是( ) #include <stdio.h> void fun(char **p) {int i;for(i 0; i < 4; i) {printf("%s", p[i]); } int main() {char *s[6] {"…

Python 本地django外部网络访问

目录 一、前提 1、确定在本地可以访问 二、 本地django项目外部网络访问 1、在settings中配置允许所有服务器访问&#xff08;局域网访问&#xff09; 2、Host配置 3、使用内网穿透工具&#xff08;ngrok&#xff09;&#xff08;外部网络访问&#xff09; &#xff08;…

Acwing---1224. 交换瓶子

交换瓶子1.题目2.基本思想3.代码实现1.题目 有 N 个瓶子&#xff0c;编号 1∼N&#xff0c;放在架子上。 比如有 5个瓶子&#xff1a; 2 1 3 5 4 要求每次拿起 2 个瓶子&#xff0c;交换它们的位置。 经过若干次后&#xff0c;使得瓶子的序号为&#xff1a; 1 2 3 4 5 对于这…

【第26天】SQL进阶-查询优化- performance_schema系列实战二:锁问题排查(MDL锁)(SQL 小虚竹)

回城传送–》《32天SQL筑基》 文章目录零、前言一、什么是MDL锁二、什么时候适合加MDL锁三、 实战演练3.1 数据准备&#xff08;如果已有数据可跳过此操作&#xff09;3.2 开启第一个会话&#xff0c;显式开启一个事务&#xff0c;并执行一个update语句不提交3.3 开启第二个会话…

机器自动翻译古文拼音 - 十大宋词 - 水调歌头 明月几时有 苏轼

水调歌头明月几时有 北宋苏轼 明月几时有&#xff0c;把酒问青天。 不知天上宫阙&#xff0c;今夕是何年。 我欲乘风归去&#xff0c;又恐琼楼玉宇&#xff0c;高处不胜寒。 起舞弄清影&#xff0c;何似在人间&#xff1f; 转朱阁&#xff0c;低绮户&#xff0c;照无眠。 不应…

idea 配置tomcat 运行jsp项目

1、复用idea打开jsp项目 2、添加tomcat配置 3、点击后会出现配置框,这里画框的地方都选上&#xff0c;版本选择1.8&#xff0c;其他的信息内容默认后&#xff0c;点击确认 4、点击 File->Project Structure,弹出界面选择Project&#xff0c;这里sdk选择1.8&#xff0c;语言选…

#7反转链表#

反转链表 1题目链接 链接 2思路 思路1(暴力): 定义两个指针或者三个指针 这里选择三个指针 清晰一点 头部 头部的下一个 头部的下一个的下一个 n1 n2 n3 做好n2和n1的连接: n2->nextn1 然后: n2n1 n3n2 n3n3->next 相当于三个指针都往…

JAVA混合使用函数式接口(BiPredicate和Consumer)、泛型、lambda表达式、stream流,优化List求交集和差集后的通用处理

文章目录前言项目场景两个List求交集和差集BiPredicate和Consumer基本介绍优化目标一步步优化代码最后前言 本文主要讲的是一个小的功能代码的优化案例&#xff0c;用到的知识点主要包括函数式接口&#xff08;BiPredicate和Consumer&#xff09;、泛型、lambda表达式、stream…

100天精通Python(数据分析篇)——第73天:Pandas文本数据处理方法之查找、替换、拼接、正则、虚拟变量

文章目录每篇前言一、Python字符串内置方法1. 文本查找2. 文本替换3. 文本拼接4. 正则提取二、Pandas实现文本查找1. str.startswith(字符串)2. str.endswith(字符串)3. str.index(字符串, start0, endlen(string))4. str.rindex(字符串, start0, endlen(string))5. str.find(字…

工具技巧和读文档 | 读函数式编程接口文档 | 匿名内部类 | lambda表达式 |IDEA

Function接口&#xff0c;函数式接口 按入参返回值分类&#xff0c;大概分为4种类型&#xff0c;再加上多个入参就又多了Bi开头的两种。 有CtrlP的时候不懂参数列表该写啥&#xff0c;就先CtrlALT看下入参类型的相关实现类&#xff01; 一些实用的快捷键&#xff1a;Ctrl P看参…

AORT:一款功能强大的多合一网络侦查与数据收集工具

关于AORT AORT是一款功能强大的多合一网络侦查与数据收集工具&#xff0c;该工具的主要目的是帮助漏洞Hunter和渗透测试人员完成网络侦查环节的各类任务。AORT基于Python开发&#xff0c;使用起来非常简单且方便&#xff0c;并且支持跨平台&#xff08;只要安装了Python 3即可…

怒删虚拟机,FPGA开发新宠-几步在Windows上安装桌面化Linux

Linux上运行Vivado这类EDA工具要比Window上快很多&#xff0c;大概就是优化的问题&#xff0c;所以选择Linux上开发是一个比较好的选择&#xff08;主要是免费&#xff09;。国内习惯了Win系统&#xff0c;所以用Linux比较少&#xff0c;那么有没有既可以在Windows上做一些文档…

Python爬虫(4)-Selenium模拟鼠标操作

在Selenium4.2以后的版本里面鼠标的操作方法都封装在了ActionChains中需要时直接取即可。 1.鼠标双击 使用方法就是调用ActionChains然后传入你需要点击的按钮的位置即可 ActionChains(driver).double_click(f1).perform() perform()的意思就是执行所有ActionChains中的动作 …

python字典应用

python字典应用 文章目录python字典应用一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤字典的综合案例使用collections模块的defaultdict类来实现创建字典。拓展知识一&#xff1a;内置函数globals()和locals()拓展知识二&#xff1a;有序字典 collections.Ord…

如何使用MyBatis简化JDBC开发?MyBatis持久层框架快速入门

文章目录1. 前言2. JDBC 存在的缺点3. MyBatis 优化4. MyBatis 快速入门5. 总结Java编程基础教程系列1. 前言 JavaEE 企业级 Java 项目中的经典三层架构为表现层&#xff0c;业务层和持久层&#xff0c;使用Java 代码操作数据库属于持久层内容&#xff0c;而 MyBatis 对 JDBC …

Multus k8s网络浅谈

Multus是什么 k8s不提供网络解决方案&#xff0c;提供CNI ( Container Networking Interface )规范&#xff0c;被CNI插件遵守&#xff08;Flannel, Calico&#xff0c;Multus等&#xff0c;这些是网络方案&#xff09; Multus 提供了将多个接口添加到pod的功能 Flannel 为每…

实现自己的数据库三

一 前言上篇实现了数据库的持久化&#xff0c;就是一个质的飞跃&#xff0c;虽然代码不复杂&#xff0c;但是对没有这方面经验者来说&#xff0c;还是意思的&#xff0c;下一步就是要完成另外一个飞跃&#xff0c;将存储的数据结构采用B树的形式来保存。在改造之前&#xff0c;…

为什么要设计非公平锁?

背景 公平&#xff1a;排队 非公平&#xff1a;在合适时机插队 非公平还是 ReentrantLock 的默认策略&#xff0c;排队时间不浪费了&#xff1f; 场景 来看这种场景 假如A持有一把锁&#xff0c;B请求这把锁&#xff0c;这时候B被挂起进入阻塞&#xff0c;A释放锁的时候&a…

点与线段的关系

点与线段的关系 对于向量a(x1,y1)和b(x2,y2) 点乘的数学意义&#xff1a;a * b x1x2 y1y2 点乘的几何意义&#xff1a;a * b |a||b|cosQ 这个可以看成是投影关系表达式&#xff1a;cosQ a * b / ( |a||b|) 令r cosQ&#xff1b; 求p点和线段AB的位置关系&#xff0c;可以…