当前位置: 首页 > news >正文

《Essential C++》学习笔记

《Essential C++》这本书,是适合从C选手快速过度到C++选手的 一本书,下面是个人记录

第一章:基础语法

第一章主要就是C语言基础,这里类似于表达式 数组 条件语句 循环语句,就不多概述了。

:::info
vector:可动态扩增的Array

  • Vector,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
  • vector,是一个能够存放任意类型的动态数组,能够增加和压缩数据。

:::

第二章:面向过程的编程风格

  1. 指针和引用的区别:
    • 在本质上来说 指针和引用都是变量 存放的都是被引用对象的地址
    • 指针变量本身可以被寻址
int a =100;
int  *p= &a;//p存放的是a的地址
int **p1 = &p;//p1存放的就是p的地址
- 而引用变量地址却不可被寻址,假如引用变量为r,&r操作得到的只能是r所指向对象的地址,而不是r本身的地址。
- 数组元素允许是指针常量,而不能是引用例如 a作为一个引用数组 a[0]=1; 无法确定是a[0]的值为1还是a[0]所引用的值为1,容易产生二义性。
- 引用不能为空,而指针可以为空。你可以只声明一个指针变量,而不去给它赋值。一个未指向任何对象的指针,其地址值为0.
- 指针可以有多级,而引用只能一级
- "sizeof 引用"得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小
- <font style="color:#DF2A3F;">当我们对指针进行解引用操作时(*p),一定要确定其值并非0,对于引用来说,因为它一定会代表某个对象,所以不需要做这样的检查</font>
  1. 堆内存
    1. 堆允许程序在运行时动态地申请某个大小的内存空间。
    2. 在C++中,通过new出来的对象,需要使用delete加以释放。
  2. inline函数:用来替代C语言的宏定义
    1. inline函数可以解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题
#include <stdio.h>
//函数定义为inline即:内联函数
inline char* f(int i) {return (i % 2 > 0) ? "奇" : "偶";
} int main()
{int i = 0;for (i=1; i < 100; i++) {printf("i:%d    奇偶性:%s /n", i, f(i));    }
}
/*
普通情况运行的时候,系统通过循环要一次次调用f函数的。
使用inline之后,每次运行相当于在把printf()里的f(i)调用直接换成了return (i % 2 > 0);这样就提高了运行效率
*/

:::info

  • 也就是说,在函数体很小的情况下,使用Inline函数可以提高效率
  • 需要注意的一点是,将函数定义为inline,仅仅是对编译器的一种建议,编译器是否执行这个请求,需视编译器而定。
  • ⚠️⚠️⚠️
  • inline函数虽好,但是需要慎用
    • 内联是以代码膨胀复制为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码, 将使程序的总代码量增大,消耗更多的内存空间。
    • 如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
    • 如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

:::

第三章:泛型编程风格

STL部分

这部分和Java以及Kotlin里面的容器几乎差不多

  1. 顺序型容器 vector与list
    1. vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。
    2. 查找效率很高,为 O(1)。但是插入和删除就比较麻烦。
    3. 而vector和java里的ArrayList一样,都具有自动扩容的功能。
    4. 不同的编译器实现的扩容方式不一样,VS2015中以1.5倍扩容,GCC以2倍扩容。
    5. list底层由双向链表实现,因此内存空间是不连续的。所以插入时间复杂度低,查找时间复杂度高。
  2. 关联容器 map和set
    1. java,里面也有类似的数据结构,map一般表示一对对的key/value组合,俗称键值对。而set就只含有key。
    2. set不允许键值重复,可以用此解决一些算法问题,例如环形链表问题。
    3. map也不允许键值重复,但是map允许修改键对应的值。set则不能修改键值。
    4. set和map底层都是红黑树,红黑树是一种具有自动平衡功能的二叉树,在set中,如果想要修改键值,那么就会破坏红黑树的结构, 所以STL中将set的迭代器设置成const,不允许修改迭代器的值。
  3. queue和stack这个和Java里面的双向链表很像,就不多说了。

Iterator(迭代器)

迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。

vector<int> v;//声明一个int类型的可变长数组
vector<int>::iterator i;//定义一个迭代器for (i = v.begin(); i != v.end(); ++i)   //用迭代器遍历容器cout << i << " ";  //*i 就是迭代器i指向的元素

Funtion object(函数对象)

函数对象可以当成一种运算符重载。思想是:用类来封装一个函数功能,然后用这个类实例化不同的函数对象。

 class  Add {public:int operator()(int a1, int a2){//重载"( )"运算符实现加法功能return a1+a2;}
} ;int  a =1  ,b = 2 ;
Add add; //实例化add对象
cout << add(a1,a2) << endl;  

第四章:基于对象的编程风格

This指针

class Theshy  //C++代码
{
public:int num;void SetNum(int p);
};
void Theshy::SetNum(int p)
{num=  p;
}
int main()
{Theshy obj;obj.SetNum(20000);return 0;
}
struct Theshy  //C代码
{int price;
};
void SetNum(struct Theshy* this, int p) //不一样的地方 
{this->price = p;
}
int main()
{struct Theshy shy;SetNum(&shy, 20000);return 0;
}

this指针是在成员函数中用来指向其调用者(一个对象)

Static关键字

该实例归所有对象共有。
static的作用(在C/C++)

  • 修饰某个变量的时候,只初始化一次,延长了局部变量的生命周期。
  • 如修饰函数在栈空间存放的数组,不想被释放,就可以用static。

static的特点

  • 静态变量都在全局数据区分配内存
  • 未经初始化的静态全局变量会被程序自动初始化为0
  • static除了修饰成员变量之外,还可以修饰函数,叫做静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。
  • 被 static 修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要 new 出一个类来
  • 被 static 修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要 new 出一个类来
  • 在 C++ 中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。
  • static除了修饰成员变量之外,还可以修饰函数,叫做静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。
#include <iostream>
using namespace std;
class Shop
{
public:Shop(int size);void ShowSize();static void ShowPrice(); //声明静态成员函数用来显示价格static int ChangePrice(int price); //声明静态成员函数用来更改价格
private:int m_size; //声明一个私有成员变量static int m_price; //声明一个私有静态成员变量
};
Shop::Shop(int size)
{m_size = size;
}void Shop::ShowSize()
{cout << "商品数量:" << m_size << endl;
}
void Shop::ShowPrice()
{cout << "商品价格:" << m_price << endl;
}
int Shop::ChangePrice(int price)
{m_price = price;return m_price;
}
int Shop::m_price = 100; //初始化静态成员变量int main(int argc, char* argv[])
{Shop::ShowPrice();Shop::ChangePrice(200);Shop::ShowPrice();Shop shop(50);shop.ShowSize();shop.ShowPrice();return 0;
}
  • 静态成员函数主要为了调用方便,不需要生成对象就能调用。

第五章:面对对象的编程风格

多态:允许将子类类型的指针赋值给父类类型的指针。和java类似这样实现了一个函数会根据传入参数的不同有不同的功能。

在程序编译阶段,对象还没有产生时,程序只能根据指针的类型来判断调用哪个函数,这时候都是调用的父类函数,当子类重写父类方法时 同时也是把继承自父类的虚表中对应函数的索引的函数指针从父类函数改成了自己的函数。这就造成了子类和父类对象里面的虚表内容不同。所以动态联编时 去子类 或者父类里面找虚表,调用的函数不同。这也就完成了多态。

#include<iostream>
using namespace std;classA{public:A(){};~A(){};void show(){cout<<"A"<<endl;}
};classB:public A{public:B(){};~B(){};
void show(){cout<<"B"<<endl;
}
};
int main()
{A *p=new B;p->show();return 0;
}

在这种情况下,程序会输出A。这就是静态联编的情况,如果我们在8和18行写上
virtual,程序就会输出B了。

第六章:以template(模板)进行编程

第六章整个一章讲都是模板,比如说我们要定义一个函数,这个函数可以实现多种类型数据比较大小的功能

int max(int x,int y);  
{return(x>y)?x:y ;}float max( float x,float y){
return (x>y)? x:y ;}

模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。

以下为实现一个求最小值函数模板

#include <iostream>
using namespace std;template<class T>
T min(T x,T y)
{
return (x<y?x:y);
}
void main( )
{int a1=2,a2=10;double d1=1.5,d2=5.6;cout<< "较小整数:"<<min(n1,n2)<<endl;cout<< "较小实数:"<<min(d1,d2)<<endl;system("PAUSE");
}
  • 模板可以显著减小源代码的大小并提高代码的灵活性,而不会降低类型安全。
  • 编译器由模板自动生成函数的过程叫模板的实例化。

例如:

template<class T>
void Swap(T & x, T & y)
{T tmp = x;x = y;y = tmp;
}
//以上省略 
int n = 1, m = 2;Swap(n, m);  //编译器自动生成 void Swap (int &, int &)函数

模板调用语句可以明确指明要把类型参数实例化为哪种类型。可以用:模板名<实际类型参数1, 实际类型参数2, …>

#include <iostream>
using namespace std;
template <class T>
T In(int n)
{return 1 + n;
}
int main()
{cout << In<double>(4) / 2;return 0;
}
// 此处实例化的模板函数原型应为:double In(double);

第七章:异常处理

异常的几个关键字和JAVA是一样的,都离不开那几个。try,catch,throw。
try用来放置可能抛出异常的代码,而catch用来捕获抛出异常的代码。

  • 抛出异常代码
double division(int a, int b)
{if( b == 0 ){throw "Division by zero condition!";//用到了throw语句}return (a/b);
}
  • 捕获异常代码
try
{// 保护代码
}catch( ExceptionName e )
{// 处理 ExceptionName 异常的代码
}
  • 异常的优点:
    • 函数的返回值可以忽略,但异常不可忽略。如果程序出现异常,但是没有被捕获,程序就会终止,这多少会促使程序员开发出来的程序更健壮一点。而如果使用C语言的error宏或者函数返回值,调用者都有可能忘记检查,从而没有对错误进行处理,结果造成程序莫名其面的终止或出现错误的结果。
    • 整型返回值没有任何语义信息。而异常却包含语义信息,有时你从类名就能够体现出来。
    • 整型返回值缺乏相关的上下文信息。异常作为一个类,可以拥有自己的成员,这些成员就可以传递足够的信息。
    • 异常处理可以在调用跳级。这是一个代码编写时的问题:假设在有多个函数的调用栈中出现了某个错误,使用整型返回码要求你在每一级函数中都要进行处理。而使用异常处理的栈展开机制,只需要在一处进行处理就可以了,不需要每级函数都处理。
  • 异常需要的几个注意点:
    • 如果异常抛出是用的 int 类型 而在外部捕获中 捕获函数是用的char类型进行的捕获那么,该错误就不会被捕获到,而代码也就此终止异常继续往外传。
    • 性能问题。这个一般不会成为瓶颈,但是如果你编写的是高性能或者实时性要求比较强的软件,就需要考虑了。
    • 指针和动态分配导致的内存回收问题:在C++中,不会自动回收动态分配的内存,如果遇到异常就需要考虑是否正确的回收了内存。在java中,就基本不需要考虑这个。
    • 函数的异常抛出列表:java中是如果一个函数没有在异常抛出列表中显式指定要抛出的异常,就不允许抛出;可是在C++中是如果你没有在函数的异常抛出列表指定要抛出的异常,意味着你可以抛出任何异常。
    • C++中编译时不会检查函数的异常抛出列表。这意味着你在编写C++程序时,如果在函数中抛出了没有在异常抛出列表中声明的异常,编译时是不会报错的。
    • 异常会导致程序的执行流乱跳,并且非常的混乱,并且是运行时出错抛异常就会乱跳。这会导致我们跟 踪调试时以及分析程序时,比较困难。

相关文章:

《Essential C++》学习笔记

《Essential C》这本书&#xff0c;是适合从C选手快速过度到C选手的 一本书&#xff0c;下面是个人记录 第一章&#xff1a;基础语法 第一章主要就是C语言基础&#xff0c;这里类似于表达式 数组 条件语句 循环语句&#xff0c;就不多概述了。 :::info vector&#xff1a;可动…...

揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?

在当今的微服务架构蓬勃发展的时代&#xff0c;配置中心扮演着极为关键的角色&#xff0c;其重要性不言而喻。今天&#xff0c;我们就以 Apollo 为例&#xff0c;聊聊配置中心在微服务架构中的重要意义。 一、微服务架构下的配置管理挑战 随着微服务架构的广泛应用&#xff0…...

每日OJ题_牛客_春游_贪心+数学_C++_Java

目录 牛客_春游_贪心数学 题目解析 C代码 Java代码 牛客_春游_贪心数学 春游 描述&#xff1a; 盼望着&#xff0c;盼望着&#xff0c;东风来了&#xff0c;春天脚步近了。 值此大好春光&#xff0c;老师组织了同学们出去划船&#xff0c;划船项目收费如下&#xff1a;…...

JavaWeb--Maven

1.初始Maven 1.1介绍 Maven 是一款用于管理和构建Java项目的工具&#xff0c;是Apache旗下的一个开源项目 。 1.2Maven的作用 2.Maven概述 2.1Maven介绍 Apache Maven是一个项目管理和构建工具&#xff0c;它基于项目对象模型(Project Object Model , 简称: POM)的概念&am…...

计算机网络——网络层导论

转发是局部功能——数据平面 路由是全局的功能——控制平面 网卡 网卡&#xff0c;也称为网络适配器&#xff0c;是计算机硬件中的一种设备&#xff0c;主要负责在计算机和网络之间进行数据传输。 一、主要功能 1、数据传输&#xff1a; 发送数据时&#xff0c;网卡将计算机…...

使用 JPA 的 `save()` 方法更新数据库中的数据

在开发基于 JPA&#xff08;Java Persistence API&#xff09;的应用时&#xff0c;数据持久化操作中的常见问题是执行 save() 方法后数据库中的数据没有更新。本文将详细介绍 JPA 的 save() 方法如何工作、其可能出现的问题&#xff0c;以及如何解决这些问题&#xff0c;以确保…...

Obsidian的Git插件设置配置全流程 -- 简单的电脑端多平台同步方案及常见问题

Obsidian的Git插件设置配置全流程 -- 简单的电脑端多平台同步方案及常见问题 参考文章引言1. git 介绍及安装2. git 本地配置及远程仓库链接3. obsidian 的 git 插件4. 常用的使用场景和对应的命令4.1. 本地仓库已推送到远端&#xff0c;如何在另一个电脑上第一次同步4.2 多端同…...

MapReduce 的 Shuffle 过程

MapReduce 的 Shuffle 过程指的是 MapTask 的后半程&#xff0c;以及ReduceTask的前半程&#xff0c;共同组成的。 从 MapTask 中的 map 方法结束&#xff0c;到 ReduceTask 中的 reduce 方法开始&#xff0c;这个中间的部分就是Shuffle。是MapReduce的核心&#xff0c;心脏。 …...

【Linux】进程控制——创建,终止,等待回收

目录 进程创建fork再介绍写时拷贝 进程终止退出码退出方式 进程等待获取子进程statuswaitwaitpid 在前两篇进程概念中&#xff0c;对进程进行了介绍&#xff0c;进行了初步认识&#xff0c;也认识到了与之相关联的进程地址空间&#xff1b;本文则对进程的生命周期——创建&…...

新手必看,17个常见的Python运行时错误

初入门的 Pythoner 在运行代码时免不了会遇到一些错误&#xff0c;刚开始可能看起来比较费劲。 随着代码量的积累&#xff0c;熟能生巧&#xff0c;当遇到一些运行时错误时能够很快的定位问题原题。 下面整理了常见的 17 个错误&#xff0c;希望能够帮助到大家。 1、忘记在 …...

pdf 添加页眉页脚,获取前五页

test /*** 加水印、页眉、页脚*/ Test void d1() throws IOException {//水印 样式调整String file "D:\\test\\2\\GB1.pdf";PdfUtil.WatermarkPDF(file); } /*** 获取前五页*/ Test void d2() throws IOException {String file "E:\\test\\2\\3.pdf";P…...

SQL 实战问题解析

在数据分析和数据库操作中&#xff0c;SQL 查询是至关重要的一环。本文将通过分析四道典型的 SQL 题目&#xff0c;深入探讨如何从复杂的业务需求中构建准确高效的 SQL 查询。 一、删除学生表冗余信息 需求解读 给定一个学生表&#xff0c;其中包含自动编号、学号、姓名、课程编…...

Android MVVM demo(使用DataBinding,LiveData,Fresco,RecyclerView,Room,ViewModel 完成)

使用DataBinding&#xff0c;LiveData&#xff0c;Fresco&#xff0c;RecyclerView&#xff0c;Room&#xff0c;ViewModel 完成 玩Android 开放API-玩Android - wanandroid.com 接口使用的是下面的两个&#xff1a; https://www.wanandroid.com/banner/jsonhttps://www.wan…...

python的安装环境Miniconda(Conda 命令管理依赖配置)

这一段时间&#xff0c;对AI大模型 有了兴趣就想研究一下。 在研究之前肯定要先把需要的编程技能掌握了。经过我查阅资料&#xff0c;今天就先学一下 python的 环境安装。 Node.js 包管理工具&#xff1a;npm 依赖配置文件&#xff1a;package.json 环境管理&#xff1a;nvm&am…...

【LeetCode】【算法】128. 最长连续序列

LeetCode 128. 最长连续序列 题目描述 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例&#xff1a; 输入&#xff1a;nums [10…...

【dvwa靶场:XSS系列】XSS (Reflected)低-中-高级别,通关啦

一、低级low 简单拿捏 <script>alert(123)</script>二、中级middle 源码过滤了script但是没有过滤大小写&#xff0c;改成大写S <Script>alert(123)</script>三、高级high 比中级高&#xff0c;过滤了script并且以及大小写&#xff0c;使用其他标…...

imu_tk配置教程(锁死ubuntu18.04,不要22.04)

在ubuntu18.04上安装。 imu_tk 的 cmake 必须要qt4.x&#xff0c;但 ubuntu22.04 和qt4.x不适配。 1、安装 ceres-solver 下载路径&#xff1a;http://ceres-solver.org/installation.html &#xff08;需要梯子&#xff0c;核心内容记录如下。需下载 ceres-solver 安装包&am…...

Vue 的 keep-alive

什么是 keep-alive&#xff1f; <keep-alive> 是一个内置组件&#xff0c;用于缓存组件实例&#xff0c;从而提高应用的性能。当包裹动态组件时&#xff0c;<keep-alive> 会缓存不活跃的组件实例&#xff0c;而不是销毁它们。这使得当组件重新激活时&#xff0c;可…...

linux进程的状态之环境变量

我们在前面了解了进程的状态及相关概念 接下来我们接着上一篇进程的状态接着了解环境变量 进程的状态 文章目录 目录 文章目录 前言 二、环境变量 1、常见环境变量 2、查看环境变量 3、修改PATH 4、HOME 5、PATH ​编辑 6、和环境变量相关的命令 三、环境变量的组织…...

【系统架构设计师】预测试卷一:论文(包括4篇论文主题对应的写作要点分析)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 试题一:论面向服务的架构设计与应用试题一写作要点试题二:论软件架构的脆弱性试题二 写作要点试题三:论分布式存储系统架构设计试题三 写作要点试题四:论网络安全体系架构设计及应用试题四 写作要点试题一:论面…...

东胜物流软件 AttributeAdapter.aspx SQL 注入漏洞复现

0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司一款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司),专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS-SQLser…...

2024年网鼎杯青龙组|MISC全解

转载或摘抄时请标明出处 MISC01 wdbflag{22226aba1d98c4302a6f508cad7da5d8} MISC02 一把梭工具没有任何结果&#xff0c;估计缺少符号表&#xff0c;直接strings flag > out.txt导出后慢慢找线索 在桌面上发现了png和txt文件&#xff0c;用文件名做一次筛选 第一行发现bas…...

查询引擎的演变之旅 | OceanBase原理解读

在关系型数据库中&#xff0c;查询调度器与计划执行器&#xff0c;有着与查询优化器同样重要的地位&#xff0c;随着计算机硬件技术的飞速进步&#xff0c;这两大模块的重要性日益凸显&#xff0c;成为提升数据库性能的关键所在。接下来&#xff0c;本文将由来自 OceanBase 的技…...

轻松理解操作系统 - Linux 软硬链接是什么?

Linux 由于其开源、比较稳定等特点统治了服务端领域。也因此&#xff0c;学习Linux 系统相关知识在后端开发等岗位中变得越来越重要&#xff0c;甚至可以说是必不可少的。 因为它的广泛应用&#xff0c;所以在程序员的日常工作和面试中&#xff0c;它都是经常出现的。它的开源特…...

Redis - 数据库管理

Redis 提供了⼏个⾯向Redis数据库的操作&#xff0c;分别是dbsize、select、flushdb、flushall命令&#xff0c; 本机将通过具体的使⽤常⻅介绍这些命令。 一、切换数据库 select dbIndex 许多关系型数据库&#xff0c;例如MySQL⽀持在⼀个实例下有多个数据库存在的&#…...

VBA02-初识宏——EXCEL录像机

一、录制宏 录制宏其实就是将一系列操作结果录制下来&#xff0c;并命名存储。这些操作可以是关于数据的处理、格式的设置、函数的运用等&#xff0c;相当于在编程语言&#xff08;如VB&#xff09;中定义的一个子程序。 在录制宏时&#xff0c;软件会记录用户执行的一系列操…...

Unity网络开发基础(part5.网络协议)

目录 前言 网络协议概述 OSI模型 OSI模型的规则 第一部分 物理层 数据链路层 网络层 传输层 第二部分 ​编辑 应用层 表示层 会话层 每层的职能 TCP/IP协议 TCP/IP协议的规则 TCP/IP协议每层的职能 TCP/IP协议中的重要协议 TCP协议 三次握手 四次挥手 U…...

forEach可以遍历不可枚举属性吗

首先第一个问题,forEach能不能遍历对象的属性 const obj { a: 1, b: 2, c: 3 }; obj.forEach((item) > console.log(item))运行这段代码我们发现发生了一个错误 这说明forEach是不可以遍历对象的属性的 在js中,forEach 方法用于遍历数组或类数组对象&#xff08;如 NodeL…...

Docsify文档编辑器:Windows系统下个人博客的快速搭建与发布公网可访问

文章目录 前言1. 本地部署Docsify2. 使用Docsify搭建个人博客3. 安装Cpolar内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows环境本地部署 Docsify 这款以 markdown 为中心的文档编辑器&#xff0c;并即时生成您的文档博客网站&#xff0c;结合…...

索引基础篇

前言 通过本篇博客的学习&#xff0c;我希望大家可以了解到 “索引” 是为了提高数据的查询效率。 索引的介绍 索引是为了提高查询数据效率的数据结构 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着…...