编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(铠甲:STL)

2024-06-14 01:04

本文主要是介绍编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(铠甲:STL),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这个充满数据结构的世界,C++已经封装了很多迅速可用的数据结构。这就像我们身上的铠甲,不管遇到什么样的怪物,都能靠着这套铠甲防御攻击。


动态数组vector

想象一下,在奇幻的世界里,有一个神奇的魔法背包,名叫vector,它来自强大的编程魔法——STL(标准模板库)。这个背包拥有三大神奇特性:

  1. 自动伸缩的魔法:不像普通的背包空间固定,vector背包能根据你放置物品的多少自动调整大小。当你往里面放入更多的宝物时,它会悄无声息地变大,仿佛内部有着无限的空间;而当你取出宝物,它又能灵巧地收缩,始终保持紧致,既不浪费空间,也不让你感到负担。

  2. 快速取用的秘诀:在vector背包里,每件宝物都有自己的位置编号,就像你在图书馆书架上按序摆放的书籍。无论何时,只要你报出编号,背包就能瞬间为你取出对应的宝物,这种直接访问的魔法让探险旅途更加顺畅。

  3. 有序排列的智慧:虽然vector背包里的空间可以随意扩展,但所有的宝物都严格按照放入的顺序整齐排列,无论是新增还是移除,都不会打乱原有的秩序,确保你随时掌握宝物的最新排列情况。

  4. 与魔法世界的兼容:这个背包不仅与各种宝物(数据类型)兼容,还能无缝对接其他魔法工具(STL算法和容器),让探险者(程序员)能够轻松组合出强大的魔法技能,解决旅途中的种种难题。

综上所述,vector不仅是探险者可靠的伙伴,更是编程世界里的一项基础而又强大的神器,它以其独特的灵活性、高效性和通用性,成为了无数编程冒险旅程中的首选装备。

#include<bits/stdc++.h>
using namespace std;int main()
{vector<int> a;//<>里放的是数据类型 a.push_back(1);//push_back是放入的函数 a.push_back(5);cout<<a[0]<<endl;//按下标输出 for(auto i:a)//循环遍历输出 {cout<<i<<endl;}vector<string> s;s.push_back("xx");for(string i='a';i<='z';i++){s.push_back(i);}for(auto k:s){cout<<k<<endl;}return 0;
}

集合set 

想象一下,在一个充满奇幻色彩的王国里,有一个特别的魔法宝盒,名叫set。这个宝盒非常神奇,它不仅能够自动整理收纳进来的宝物,确保每个宝物都是独一无二的,而且还能够按照一定的魔法法则自动排序,让宝物井然有序。

宝物收纳与去重

每当勇士从冒险中带回新的宝物,只要轻轻一扔进set宝盒,宝盒就会施展它的魔力:如果盒内已经有了同样的宝物,它就会拒绝接纳,确保每个种类的宝物只保留一件,完美实现了自动去重的效果。这样一来,不管收集了多少宝物,盒子里始终保持着每件宝物的独特性。

自动排序

更令人称奇的是,set宝盒内部似乎有一本隐形的魔法书,上面记载着一套排序咒语。每当有新宝物加入,宝盒会立刻按照这本书上的规则,自动将新宝物放到合适的位置,确保所有宝物都按照一定的顺序排列。这样一来,不论何时打开宝盒,里面的宝物总是整齐划一,便于勇士快速找到他想要的那一件。

只可观摩,不可篡改

不过,这个宝盒有个特别的规定:一旦宝物被妥善安置,就不允许勇士直接从中取出宝物进行修改后再放回。宝物一旦被收纳,就如同被施加了保护咒,只能整件取出或者整件替换,保证了宝盒内宝物序列的稳定和纯净。

魔法探索

在编程的世界里,set就是这样一个数据结构,它来自于强大的STL(标准模板库)。开发者可以用它来存储唯一且有序的数据,比如存储不重复的用户ID、整理去重的单词列表等。通过简单的插入、删除和查找操作,set就能帮助我们高效地管理这些数据,就像是一个自动分类和过滤的神奇宝盒,让代码的世界也充满了秩序和效率。

#include<bits/stdc++.h>
using namespace std;int main()
{set<int> a;//set会自动去重 且 自动从小到大排序 a.insert(1);//insert是插入函数 a.insert(5);a.insert(4);a.insert(6);a.insert(1);for(auto k:a){cout<<k<<endl;} return 0;
}

map

想象你是一位探险家,手握一张古老而神奇的藏宝图,这张图就是map——编程世界里的宝藏定位器。与普通地图不同,这张藏宝图不仅标出了宝藏的位置,还为每个宝藏配上了独一无二的秘密钥匙,让每一次寻宝之旅都精准而高效。

宝藏与钥匙的约定

在这张藏宝图上,每个宝藏(value)都被精确绑定到一把特定的钥匙(key)上。钥匙可以是任何独特的东西,比如一个数字、一段文字或者一个符号,每个钥匙都指向地图上的唯一一个宝藏。这意味着,当你手持正确的钥匙,就能够立即找到对应的宝藏,无需翻遍整个地图。

寻宝之旅

  • 添加宝藏:如果你发现了新的宝藏,只需将这宝藏连同其专属钥匙一起记录在地图上,map会自动帮你归档,确保下次能迅速找回。

  • 探索宝藏:想查看某个特定钥匙所对应的宝藏,只需轻轻一点,map瞬间展示出藏宝地点,无需遍历整个藏宝图。

  • 更新秘密:如果某处宝藏的位置发生了变化,或者你想更换宝藏,只要提供正确的钥匙,就可以直接替换或更新该处的宝藏信息。

  • 抹去痕迹:若决定放弃某个宝藏,只需告诉map对应的钥匙,它就会永久抹去那份记录,确保藏宝图永远是最新的。

魔法的秩序

更令人惊叹的是,这张藏宝图自动保持着所有钥匙的有序排列,无论是字母顺序、数字大小,或是你自定义的规则,它都能迅速响应,让你在浩瀚的信息中迅速定位,无论是查找、增添还是删除,都如同施展了一场迅速而精确的魔法。

#include <bits/stdc++.h>
using namespace std;int main() {// 创建一个魔法字典,键是咒语名,值是魔法效果描述map<string, string> spellbook;// 放入咒语及其效果spellbook["Lumos"] = "发出亮光照亮四周";       // 添加照明咒spellbook["Wingardium Leviosa"] = "使物体漂浮"; // 添加漂浮咒// 输出特定咒语的效果cout << spellbook["Lumos"] << endl; // 输出: 发出亮光照亮四周// 遍历魔法字典,展示所有咒语及其效果for(auto entry : spellbook) {cout << "咒语: " << entry.first << ", 效果: " << entry.second << endl;}// 创建另一个魔法字典,这次关联字母与该字母在魔法字母表中的位置map<char, int> magicalAlphabet;// 初始化字母表for(char letter = 'a'; letter <= 'z'; ++letter) {magicalAlphabet[letter] = letter - 'a' + 1; // 计算位置}// 输出魔法字母表for(auto entry : magicalAlphabet) {cout << "字母: " << entry.first << ", 位置: " << entry.second << endl;}return 0;
}

栈stack

想象你正置身于一个古老而神秘的图书馆深处,那里藏有一本无尽之书,名为stack。这本魔法书与众不同,它遵循着“后进先出”的古老法则,记录着一系列珍贵的知识和秘密。

知识的叠加

在这个图书馆里,每位学者都小心翼翼地向这本无尽之书《stack》中添加新的篇章。有趣的是,每次添加新页,都会自动置于书的最上方,就像堆叠起的盘子,最新放置的总是在最顶端,最下方的则是最早放置的。这便是stack的核心奥义——“后进先出”(LIFO, Last In First Out)原则。

探索与揭示

  • 压栈:每当有新的发现或灵感闪现,学者们便使用push这个魔法词语,将新知识轻轻一推,它便神奇地出现在书的最顶层,成为当前最亟待探索的内容。

  • 弹栈:而想要回顾最近一次添加的内容,只需轻轻一声pop,最上方的页面便会自动分离,展露出其下的秘密,而这份知识也随之离开了《stack》,回到了学者的记忆之中。

  • 窥视顶页:如果只是好奇而不急于揭开,top法术能让最上层的知识显露一角,供人一窥究竟,而不会改变书的堆叠顺序。

  • 检测空满:随着时间流逝,学者们还能通过emptysize两种探测魔法,了解书是否已满载知识,或是空空如也,等待新的填充。

生活中的隐喻

在编程的世界中,stack就如同那个神秘图书馆中的无尽之书,它帮助我们管理那些需要遵循特定顺序处理的数据,比如函数调用的顺序、撤销操作的历史记录、浏览器的后退按钮等。每当有新的操作发生,就像在书中添加新的一页;而当需要回溯时,最近的操作被最先处理,恰似学者翻阅书页,探求最近的记忆。

#include<bits/stdc++.h>
using namespace std;int main()
{stack<int> st;st.push(1);//入栈 st.pop();//出栈 cout<<st.size()<<endl;//栈的大小 while(!st.empty())//判断栈不为空时 {cout<<st.top()<<endl;//输出栈顶 st.pop();}return 0;
}

 队列queue

信使的守则

队列遵循着“先进先出”(First In, First Out, FIFO)的古老法则。这意味着最早到达队列的包裹,将最先被送达,正如清晨的露珠等候阳光的亲吻,排在首位的旅客期待着第一缕阳光的照耀。

魔法包裹的旅程

  • 入队:每当新的包裹来到,魔法使只需轻声一句“enqueue”,包裹便自动加入队列的末尾,融入那条光河之中,静候它的旅程。

  • 出队:而在队列的另一端,最前面的包裹在“dequeue”的咒语下,化作一道光芒,飞向它的目的地,同时为后面的包裹腾出了前进的空间。

  • 窥视队首:若想知晓即将出发的是哪份包裹,只需施展“peek”法术,便能在不扰乱队列秩序的情况下,一睹其风采。

  • 检查队列:用“is_empty”或“size”咒语,可快速了解队列是否空空如也,或是包裹数量几何,这对于管理这条魔法通道至关重要。

队列的魔力应用

在魔法与现实交织的世界里,队列的形态千变万化:

  • 魔法师的助手:在繁忙的魔法学院,学员提交的作业通过队列有序等待批改,保证了每位学生都能及时得到反馈。

  • 传送门的守卫:在多维旅行的传送门旁,旅客们排成队列,按顺序穿越,维持了时空旅行的稳定与安全。

  • 咒语的编织:复杂的咒语组合中,每个咒词依序通过队列等待释放,确保魔法仪式的精准执行。

#include<bits/stdc++.h>
using namespace std;int main()
{queue<int> q;q.push(1);//入队 q.pop();//出队 cout<<q.size()<<endl;//队列大小 while(!q.empty())//队列不为空时 {cout<<q.front()<<endl;//输出队列头 q.pop();} return 0;
}

练习题 

B3614 【模板】栈 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

B3616 【模板】队列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P3370 【模板】字符串哈希 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P5250 【深基17.例5】木材仓库 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P5266 【深基17.例6】学籍管理 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P3613 【深基15.例2】寄包柜 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P4387 【深基15.习9】验证栈序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

L1-079 天梯赛的善良 - 团体程序设计天梯赛-练习集 (pintia.cn)

L1-080 乘法口诀数列 - 团体程序设计天梯赛-练习集 (pintia.cn)

L2-002 链表去重 - 团体程序设计天梯赛-练习集 (pintia.cn)

L2-014 列车调度 - 团体程序设计天梯赛-练习集 (pintia.cn)

百看不如一练,只有实践才是进步最快的方式,更要独立思考,如果想不出来了就看题解,会有眼前一亮的感觉。好啦,今天就到这里吧。下一期再见,记得给专栏点个关注,明天接着来哦~

这篇关于编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(铠甲:STL)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058937

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象