C语言快速进阶C++(基本篇+STL篇)

article/2025/10/9 15:44:10

目录

前言

用C++做题的好处

using namespace std

cin,cout头文件

变量声明

bool变量

const定义常量

string类

结构体

引用&

vector

set

map(键值对)

stack(栈)

queue(队列)

unordered_map和unordered_set(无序键值对和无序集合)


此思维导图来源于b站up主 

前言

        C语言是一门很强大的编程语言,刚学完了C语言为了进阶,有着刷更多算法题的需求,并且在使用C语言的过程中,有很多繁琐的步骤。因此我在此记录C语言在进阶C++的过程中所需要学习的内容,让我可以在由C语言进阶C++的过程中巩固,提高C++的熟练度。

用C++做题的好处

        为什么要用C++来刷算法题呢,用C语言的过程中,写代码是很繁琐的,要用一些数据结构、栈、队列,这些都是要自己用C语言来实现,会花费很多的时间,而在C++中,可以直接调用STL库中的栈和队列,大幅地提高了做题的效率,同时有很多的工具。并且在此之上,C++是完全兼容C语言的,可能会有一些细微的差别,但差别并不大,再者string类对字符串的处理很好用,但在实现相同的功能时,C++的速度可能会稍慢与C语言,例如使用cin和cout进行输入输出与scanf和printf相比会稍慢一些,但更便利。

using namespace std

#include<iostream>
using namespace std;
int main(void) 
{int n;cin >> n;cout << "woaini" << ' ' << n << endl;return 0;
}

1.头文件iostream为输入输出流,可以相当于C语言中的stdio.h,是一个必须的头文件

2.using namespace的意思是使用名称空间,该空间名称便为std为标准输入输出,using namespace std;代表的意思就是使用std这个命名空间。为什么要使用命名空间呢,因为不同厂商在建立函数时可能会有函数名重复的情况,为避免这种情况,引用命名空间就可以只使用该名称空间下的函数,上文代码中的cin、cout就是std名称空间中的函数。

3.这里cin为输入函数后面需接">>",表达的意思为输入一个值赋予n,cout为输出函数后面需接"<<",表达的意思为输出"<<"后面的参数,作用分别相当于C语言中的scanf和printf,不过这里的输入不用格式化输入来表示常量类型,也不用“&”,更加简洁。

4.endl表示的是end of line起到换行的作用作用相当于"\n",

cin,cout头文件

1.cin和cout在使用时的确会更方便,但是由于不用输入格式化输出和输入,所以在使用时速度会稍慢于scanf和printf。

2.C++的头文件与C语言的不同在于C语言在调用头文件时要在头文件后面加上".h",而C++只需在头文件前面加上“c”即可,如:#include<string.h>可改为#include<cstring>

变量声明

C++的变量声明相较于C语言使用更加的便利,C++可在函数的任何地方进行定义,其中最明显的体现在for循环中i的声明

以下为C++中变量声明

#include<iostream>
using namespace std;
int main(void)
{for (int i = 0; i < 10; i++)cout << a << ' ';return 0;
}

以下为C语言中的变量声明

#include<stdio.h>
int main(void)
{int i;for (i = 0; i < 10; i++)printf("a ");return 0;
}

 将以上两段代码对比便可得知在变量声明上的区别。

bool变量

bool变量是C++特有的一种新类型变量,有两个值非0为ture、0为false,接下来引入一段代码以便于对bool变量有更深入的理解

#include<iostream>
using namespace std;
int main(void)
{bool b1 = true;bool b2 = false;bool b3 = -1;cout << b1 << ' ' << b2 << ' ' << b3;return 0;
}

 该代码的运行结果为

const定义常量

在C语言中被const定义的称为常变量,那他为什么成为常变量而不称为常量呢?因为C语言中被const所定义的常变量虽然不能改变其值,但是不能用于定义一个确定长度的数组,所以本质上还是变量。而在C++中const所定义的是常量可以用于定义一个确定长度的数组,所以const的作用类似#define

string类

1.定义

    string a = "I can understand your meanning.";string b = "But I don't know what I should do.";

2.拼接

在C++中string类字符串可直接进行拼接

string sub = a + b;

 这里字符串b会拼接到字符串a的后面

3.输入(出)

#include<iostream>
using namespace std;
int main(void)
{string a,b;cout << "请依次输入字符串a,b";cin >> a >> b;string sub = a + b;cout << a << endl << b << endl << sub;return 0;
}

这里的输入用了cin,但此次输入在遇到空格或者TAB时会结束此次输入故可以引用 getline(cin,a)来输入一整行的字符串遇到回车结束

4.处理

(1).s.length可以获取字符串s的长度

(2).

#include<iostream>
using namespace std;
int main(void)
{string a= "Don't lose yourself.";string a_sub1 = a.substr(6, 4);string a_sub2 = a.substr(6);cout << a_sub1 << endl << a_sub2;return 0;
}

运行结果为 

 a.substr(n,m)的作用是返回字符串a第n个字符后m个字符所组成的新字符串,此功能也有另一种使用方法a.substr(n)省去m便是返回字符串a第n个字符后所有的字符所组成的新字符串。

结构体

在C语言中定义一个结构体变量是,前面要加上struct,而在C++中可以直接用结构体名定义结构体变量,在下方代码中便有此体现

#include<iostream>
using namespace std;
struct stu
{int No;string name;
};
int main(void)
{stu student;return 0;
}

引用&

在C++中的引用&与C语言中的取地址符&没有任何关系,注意不要弄混,使用形式为int &a,接下来引入一段代码

#include<iostream>
using namespace std;
void add_10(int& a);
int main(void)
{int a = 5;add_10(a);cout << a;return 0;
}
void add_10(int& a)
{a += 10;
}

 在这段代码中add_10函数引用a调用的就是实参,省去了c语言需要传地址和接地址的麻烦。

vector(数组)

1.头文件:#include<vector>

2.创建数组:创建vector数组有三种形式

    vector <int> a;vector <int> b(5);vector <int> c(5, 4);

 a数组没有设定大小,b便定义为可以存放5个int类变量的数组,c定义为存放5个int类变量,每个变量的值为4。没有被初始化的数据默认为0。

3.处理

接下来引入一段代码对vector数组进行详解

#include<iostream>
#include<vector>
using namespace std;
int main(void)
{vector <int> a(5, 4);a.resize(10);a.push_back(11);for (auto p = a.begin(); p != a.end(); p++)cout << *p << ' ';return 0;
}

 此段代码运行结果为

(1)a.resize(n)的作用为重新分配数组大小为n

(2)a.pushback(data)的作用为在数组a的结尾追加数据data

(3)迭代器

for (auto p = a.begin(); p != a.end(); p++)cout << *p << ' ';

 迭代器的作用可以将数组中的所有元素输出,其中p为指针变量,要用指针变量的使用方法对其进行使用。a.begin()的返回值为数组第一个元素的地址,a.end()的返回值为最后一个元素的下一个地址。

set(集合)

1.set是集合,它里面的元素各不相同,而且元素会按照从小到大排序

2.头文件:#include<set>

3.创建集合:set <int> a;

                  注:a的后面不可以加内容

4.处理

接下来引入一段代码对set的处理进行详解

#include<iostream>
#include<set>
using namespace std;
int main(void)
{set<int>a;a.insert(5);a.insert(3);a.insert(4);a.insert(2);for (auto p = a.begin(); p != a.end(); p++)cout << *p<<' ';cout << endl;a.erase(3);for (auto p = a.begin(); p != a.end(); p++)cout << *p << ' ';cout << endl;cout << (a.find(3) != a.end()) << ' ' << (a.find(4) != a.end());return 0;
}

此段代码的运行结果为 

(1).插入:a.insert(n):将n的值插入集合a

(2).删除:a.erase(n):删除集合a中的n

(3).遍历:集合中的所有元素可以用迭代器遍历

for (auto p = a.begin(); p != a.end(); p++)
        cout << *p << ' ';

(4).查找:a.find(n):查找集合a中是否有n,其返回值为指针,这里的(a.find(3) != a.end())和(a.find(4) != a.end())实际上都是bool值,分别为false和ture,故返回值分别为0和1。

map(键值对)

        1.map是键值对,它会自动将所有的键值从小到大排序,其中排序的规则类似于C语言string库中的函数strcpm,通过从前往后对字符串中字符的ASC码值大小进行比较排序。

        2.头文件#include<map>

        3.创建键值对:

map <string,int> a;

         其中string为键,int为值,成对故称为键值对。

        4.处理

        接下来引入一段代码对键值对进行详细解读

#include<iostream>
#include<map>
using namespace std;
int main(void)
{map<string, int>a;//创建键值对a["you"] = 3;a["hello"] = 6;a["world"] = 5;a["i"] = 1;a["love"] = 2;a["x"] = 4;//添加键值对cout << a["hello"] << ' ' << a["world"] << endl;//输出键值对中对应的值for (auto p = a.begin(); p != a.end(); p++)//运用迭代器输出该键值对中所有的值cout << p->first << ':' << p->second << endl;//输出键值对,输出方式类似结构体cout << a.size() << endl;//获取长度并输出return 0;
}

 (1)添加:添加键值对采用下面这种方式,其中的键用'[ ]'包含由于键为字符串故用" "包含在其后用'='连接对应的值

a["you"]=1;

 (2)访问:

cout << a["hello"]//访问

 其中输出结果为该键所对应的值。

(3).遍历:

for (auto p = a.begin(); p != a.end(); p++)//运用迭代器输出该键值对中所有的值cout << p->first << ':' << p->second << endl;//输出键值对,输出方式类似结构体

 这里在输出键值对的时候用的不是*p而是p->实际上是因为map(键值对)是以结构体类型进行定义,故获取方式类似于结构体指针,map可以看作为

typedef struct
{string first;int second;
}map;

(4). 获取长度

cout << a.size() << endl;

 用size()来获取键值长度,其长度由键值对个数决定,一个键值对占一个字节。

stack(栈)

1.在C语言中,数据结构中会接触栈,其特点为先入后出

2.头文件:#include<stack>

3.创建栈:stack <int> a;

4.处理:下面引入一段代码对stack(栈)进行详细解释

#include<iostream>
#include<stack>
using namespace std;
int main(void)
{stack <int> a;//创建栈a.push(5);//压栈a.push(4);//压栈a.push(7);//压栈a.pop();//出栈a.push(75);//压栈cout << a.top() << endl;//访问栈顶cout << a.size() << endl;//获取栈顶长度return 0;
}

(1).压栈

a.push(5);//压栈

 此操作将5压入栈中

(2).出栈

a.pop();//出栈

 此操作将栈顶元素删除

(3).访问栈

cout<<a.top()<<endl;

 此操作访问栈顶元素

(4).获取栈项长度

cout<<a.size()<<endl//获取栈项长度

 此操作与前文一样运用size()获取长度,根据上文代码,此栈长度应为3.

5.注:栈可以通过size()获取长度,但是不能够通过迭代器获取全部元素

queue(队列)

1.队列的特点与栈相反,先进先出,后进后出,但是栈只能获取栈顶元素,而队列可以获取队首和队尾元素

2.头文件:#include<queue>

3.创建队列:queue <int> a;

4.处理:接下来引入一段代码对队列进行详细解释

#include<iostream>
#include<queue>
using namespace std;
int main()
{queue <int> a;//创建队列for (int i = 0; i < 10; i++)a.push(i);//入队cout << "队首为:" << a.front() << "队尾为:" << a.back()<<endl;//访问队首队尾a.pop();//出队cout << "队首为:" << a.front() << "队尾为:" << a.back()<<endl;a.push(20);cout << "队首为:" << a.front() << "队尾为:" << a.back()<<endl;cout << a.size() << endl;//获取队列长度return 0;
}

该程序运行结果为 

(1).入队:a.push(i)

(2).出队:a.pop()

(3).访问队首:a.front()

(4).访问队尾:a.back()

(5).获取长度:a.size()

5.注:队列与栈一样不能用迭代器遍历,但是可以用size()获取长度。 

unordered_map和unordered_set(无序键值对和无序集合)

1.unordered_map和unordered_set其实就是无序的键值对和集合,若做题时超时,并且对元素的顺序没有要求便可以使用。

2.头文件:#include<unordered_map>

                 #include<unordered_set>

3.map和set的使用在前文已经介绍过了接下来引入一段代码对unordered_map和unordered_set进行详解

#include<iostream>
#include<unordered_map>
#include<unordered_set>
using namespace std;
int main(void)
{unordered_map <string,int> m;unordered_set <int> s;s.insert(5);s.insert(4);s.insert(1);s.insert(7);m["i"] = 5;m["you"] = 7;m["x"] = 8;m["love"] = 6;for (auto p = s.begin(); p != s.end(); p++)cout << *p << ' ';cout << endl;for (auto p = m.begin(); p != m.end(); p++)cout << "键:" << p->first << "值:" << p->second << endl;return 0;
}

 该程序的运行结果为

可以发现通过迭代器输出的键值对和集合为乱序,其顺序的确定包含其他方面的知识,再此不过多赘述。


http://chatgpt.dhexx.cn/article/xIKhpP3f.shtml

相关文章

C语言fgets()函数的用法总结

从c11之后取消了gets()函数&#xff0c;用fgets()代替&#xff0c;用法有所不同&#xff0c;这里详细介绍下fgets()该如何使用。 char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) 第一个参数为数据存放的数组&#xff0c;第二个参数为最大长度&#x…

C语言一行语句太长的换行处理方法

文章目录 1、C语言中代码的多行书写2、获取视频教程3、版权声明 1、C语言中代码的多行书写 对C语言初学者来说&#xff0c;编写的程序的功能很简单&#xff0c;一句代码很短&#xff0c;但是在实际开发中&#xff0c;参数往往很长很多&#xff0c;一句代码可能会很长&#xff…

(c语言)fgest()键盘获取后解决换行符'\n'的问题

fgets是会读取回车换行符的。有时候我们并不希望在字符串中存在换行符。 #include <stdio.h>int main (int argc,char *argv[]) {char str[30]"";//scanf("%s",str);printf("随便输入一个字符串呗&#xff1a;");fgets(str,sizeof(str),s…

C语言按行读取文件的正确使用:fgets、feof、ferror

转自 https://blog.csdn.net/yss28/article/details/53453959 一、fgets函数 原型 char *fgets(char *buf, int bufsize, FILE *stream); 功能 fgets函数用来从stream所指文件中读入bufsize-1个字符放入buf为起始地址的空间内&#xff1b;如果在未读满bufsize-1个字符之时…

Linux系统下C语言的编程技巧

Linux系统能够为人们提供更加安全实用的效果,保证计算机系统能够稳定的运行。利用Linux系统下首先要进行C语言的编程,掌握编程的技巧能够更好的发挥计算机的作用。如何掌握Linux系统下计算机C语言的编程技巧是计算机发展的关键要素。本文对Linux系统下计算机C语言的编程技巧进行…

C语言使用fgetc()函数

fgets&#xff08;&#xff09;函数用法比单一&#xff0c;请结合代码一起理解 #include "stdio.h" #include "stdlib.h" int main() {FILE *fp; //定义文件指针char filename[200]; //存放输入的文件名字char str; //存放一个职工…

C语言-宏的实现

写一个宏&#xff0c;计算结构体中某变量相对于首地址的偏移。 结果 #define struct(struct_type,numname) (size_t)&(((struct_type*)0)->numname)实现过程 #include<stdio.h> #define struct(struct_type,numname) (size_t)&(((struct_type*)0)-…

C语言中fgets()函数回车符相关的问题

fgets函数 目录 fgets函数fgets函数与gets函数fgets函数包含回车符原因消去回车符需要消去回车符的情况任务描述编程要求测试说明思路代码问题关键 消去操作 fgets函数与gets函数 请移步下方链接&#xff0c;其中包含了scanf函数、gets函数以及fgets函数的区分总结&#xff1a…

c语言中fgetc函数的介绍

点击上方蓝字关注我&#xff0c;了解更多咨询 1、fgetc函数返回的字符实际上是文件流中位置指针指向的字符。 当fgetc函数读取错误时&#xff0c;返回EOF并设置文件错误标志位。 2、该函数以无符号char强制转换为int的形式返回读取的字符&#xff0c;如果到达文件末尾或出现读错…

fgets()函数的详解-使用技巧-C语言基础

这篇文章要探讨的是“fgets()函数的详解以及使用时需要注意的一些细节”。涉及fgets()函数的应用和需要注意的问题。属于C语言基础篇&#xff08;持续更新&#xff09;。 fgets()&#xff08;函数原型&#xff1a;char *fgets(char *restrict str, int size, FILE *restrict s…

男女声语音转换

男女声特点 &#xff08;此部分转载自https://blog.csdn.net/u011389706/article/details/78965233&#xff09; 男女声基本区别 男女声主要区别在于男女声基音频率&#xff08;pitch frequency&#xff09;的高低。一般女声的音调比男声的音调高&#xff0c;这种不同主要是反…

最新游戏陪玩语音聊天系统源码+视频搭建教程

一个人的游戏叫孤独&#xff0c;一群人的游戏才是乐趣&#xff0c;随着电竞产业在国内的快速发展&#xff0c;游戏陪练行业也迅速成长&#xff0c;现在很多游戏玩家为了追求更高质量的游戏体验感&#xff0c;往往会在玩游戏的过程中找陪练&#xff0c;通过陪玩系统进行预约游戏…

伪造微信语音文件的过程分析

说实话&#xff0c;写这篇《续》&#xff0c;小编是很纠结的。我们绝不是要传授犯罪方法&#xff0c;而是要告诉大家&#xff0c;伪造微信语音聊天记录的行为是如何进行的。&#xff08;安卓实测&#xff0c;苹果略有不同&#xff09; 一、微信语音文件的存储 关于这一点&…

微信PC端技术研究(2)-保存聊天语音

微信PC端技术研究-保存聊天语音 转载地址&#xff1a;[原创]微信PC端技术研究(2)-保存聊天语音-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com 0x0. 前言 最近又学习了某位大佬用CE的方法&#xff0c;大佬的一句话有点醍醐灌顶&#xff0c;然后有了新的感觉&#xff0…

将微信语音消息转换为 mp3

获取语音文件&#xff08;.silk&#xff09; 需要在电脑上实现。首先&#xff0c;查看你的微信 Mac 版本将数据存放在哪个目录下&#xff0c;我的是在这个目录下&#xff1a; /Users/henry/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.te…

WX Backup - 免费微信聊天记录备份导出与查看工具 (可提取图片/视频/语音)

微信绝对是一个让人爱恨交织的 APP&#xff0c;它在国内几乎完全占据了人们的社交以及生活的方方面面&#xff0c;但腾讯却并没有为微信提供好用的「聊天记录」备份导出和查看的功能。 WX Backup 是一款完全免费的微信聊天记录备份导出工具&#xff0c;支持 Windows 和 Mac&…

微信语音文件转换mp3

1、先找到手机里面的音频文件&#xff08;.amr&#xff09; 2、下载软件silk2mp3 ①双击silk2mp3.exe ②选择文件 ③开始转换 3、本来以为电脑客户端中也能找到相应的文件&#xff0c;但是发现是加密过的&#xff0c;不能用&#xff1b;所以只能使用android手机找到对应文件…

怎么导出微信语音【亲测有效】

在手机上长按你想导出的语音&#xff0c;点收藏 来到我的-收藏&#xff0c;打开刚才收藏语音&#xff0c;右上角三个点点&#xff0c;点转存为笔记 ok放下手机 来到pc端微信 - 收藏&#xff0c;找到刚才的笔记 进去&#xff0c;选中 - 右键 - 复制 发给你的文件传输助手 找到…

微信语音转换成mp3文件保存的简单详细步骤

目录 读者手册 一、前言 二、操作步骤一 把语音转化为silk文件&#xff08;silk后缀的文件&#xff09; 1.长按语音收藏&#xff08;手机操作&#xff09; 2.找到主页收藏 3.找到收藏的语音 4.转存为笔记 5.点击笔记里面的语音&#xff08;下面全部电脑操作&#xff0…