C++ Qt开发:使用关联容器类

当我们谈论编程中的数据结构时,顺序容器是不可忽视的一个重要概念。顺序容器是一种能够按照元素添加的顺序来存储和检索数据的数据结构。它们提供了简单而直观的方式来组织和管理数据,为程序员提供了灵活性和性能的平衡。

Qt 中提供了丰富的容器类,用于方便地管理和操作数据。这些容器类涵盖了各种不同的用途,从简单的动态数组到复杂的映射和集合。本章我们将主要学习关联容器,主要包括 QMapQSetQHash,它们提供了键值对存储和检索的功能,允许通过键来快速查找值。

1.1 QMap

QMap 是 Qt 中的有序关联容器,用于存储键值对,并按键的升序进行排序。以下是关于 QMap 的概述:

1.1.1 特点和用途

  • 有序性: QMap 中的元素是有序的,按照键的升序进行排列。
  • 唯一键: 每个键在 QMap 中是唯一的,不允许重复键。
  • 键值对存储: 存储键值对,每个键关联一个值。
  • 性能: 插入和查找操作的平均复杂度是 O(log n),适用于需要按键排序并进行频繁查找的场景。

1.1.2 函数和功能

以下是关于 QMap 常用函数及其功能的总结:

函数功能
insert(const Key &key, const T &value)QMap 中插入键值对。
insertMulti(const Key &key, const T &value)QMap 中插入允许相同键的多个值。
remove(const Key &key)移除指定键的元素。
value(const Key &key) const返回指定键的值。
contains(const Key &key) const判断是否包含指定键。
isEmpty() const判断 QMap 是否为空。
size() const返回 QMap 中键值对的数量。
clear()清空 QMap 中的所有元素。
keys() const返回 QMap 中所有键的列表。
values() const返回 QMap 中所有值的列表。
begin()返回指向 QMap 开始位置的迭代器。
end()返回指向 QMap 结束位置的迭代器。
constBegin() const返回指向 QMap 开始位置的常量迭代器。
constEnd() const返回指向 QMap 结束位置的常量迭代器。
find(const Key &key) const返回指向 QMap 中指定键的迭代器。
lowerBound(const Key &key) const返回指向 QMap 中不小于指定键的第一个元素的迭代器。
upperBound(const Key &key) const返回指向 QMap 中大于指定键的第一个元素的迭代器。
count(const Key &key) const返回指定键的数量。
toStdMap() constQMap 转换为 std::map

这些函数提供了对 QMap 中键值对的插入、删除、查找和遍历等操作。根据需求选择适当的函数以满足操作要求。

1.1.3 应用案例

正如如下代码所示,我们提供了QMap<QString,QString>字典类型的关联数组,该数组中一个键映射对应一个值,QMap容器是按照顺序存储的,如果项目中不在意顺序可以使用QHash容器,使用QHash效率更高些。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QtGlobal>
#include <QMap>
#include <QMapIterator>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QMap<QString,QString> map;map["1001"] = "admin";map["1002"] = "guest";map.insert("1003","lyshark");map.insert("1004","lucy");// map.remove("1002");// 根据键值对查询属性std::cout << map["1002"].toStdString().data() << std::endl;std::cout << map.value("1003").toStdString().data() << std::endl;std::cout << map.key("admin").toStdString().data() << std::endl;// 使用STL语法迭代枚举Map键值对QMap<QString,QString>::const_iterator x;for(x=map.constBegin();x != map.constEnd(); ++x){std::cout << x.key().toStdString().data() << " : ";std::cout << x.value().toStdString().data() << std::endl;}// 使用STL语法实现修改键值对QMap<QString,QString>::iterator write_x;write_x = map.find("1003");if(write_x !=map.end())write_x.value()= "you ary in";// 使用QTglobal中自带的foreach遍历键值对QString each;// --> 单循环遍历foreach(const QString &each,map.keys()){std::cout << map.value(each).toStdString().data() << std::endl;}// --> 多循环遍历foreach(const QString &each,map.uniqueKeys()){foreach(QString x,map.value(each)){std::cout << each.toStdString().data() << " : ";std::cout << x.toStdString().data() << std::endl;}}return a.exec();
}

上述代码是如何使用QMap容器,其实还有一个QMultiMap容器,该容器其实是QMap的一个子集,用于处理多值映射的类,也就是说传统QMap只能是一对一的关系,而QMultiMap则可以实现一个Key对应多个Value或者是反过来亦可,实现一对多的关系。

如果总结起来可以发现两者的异同点;

QMap
  • 唯一键: QMap 中每个键都是唯一的,不允许重复键。
  • 键排序: QMap 中的元素是按键的升序排列的。
  • 使用场景: 适用于需要键值对有序且键唯一的场景。
QMultiMap
  • 允许重复键: QMultiMap 中可以包含重复的键,即多个键可以映射到相同的值。
  • 键排序: QMultiMap 中的元素是按键的升序排列的。
  • 使用场景: 适用于允许键重复,并且需要键值对有序的场景。
相同点
  1. 键值对: 都是用于存储键值对的容器。
  2. 有序性: 元素在容器中是有序的,按键的升序排列。
不同点
  1. 键唯一性: QMap 中每个键都是唯一的,而 QMultiMap 允许重复的键。
  2. 使用场景: QMap 适用于需要键唯一的情况,而 QMultiMap 适用于允许键重复的情况。

如下所示,展示了如何使用QMultiMap实现一对多的映射关系;

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QList>
#include <QMultiMap>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QMultiMap<QString,QString> mapA,mapB,mapC,mapD;mapA.insert("lyshark","1000");mapA.insert("lyshark","2000");mapB.insert("admin","3000");mapB.insert("admin","4000");mapC.insert("admin","5000");// 获取到里面的所有key=lyshark的值QList<QString> ref;ref = mapA.values("lyshark");for(int x=0;x<ref.size();++x){std::cout << ref.at(x).toStdString().data() << std::endl;}// 两个key相同可相加后输出mapD = mapB + mapC;ref = mapD.values("admin");for(int x=0;x<ref.size();x++){std::cout << ref.at(x).toStdString().data() << std::endl;}return a.exec();
}

1.2 QHash

QHash 是一个无序的关联容器,它存储键值对,但与 QMap 不同,QHash 不会对键进行排序。

1.2.1 特点和用途

  • 键值对存储: QHash 中的元素以键值对的形式存储,但与 QMap 不同,QHash 中的元素是无序的。

  • 无序性: QHash 中的元素是无序的,没有特定的排列顺序。

  • 唯一键: 每个键在 QHash 中是唯一的,不允许重复键。

  • 性能: 插入和查找操作的平均复杂度是 O(1),适用于需要快速插入和查找的场景。

1.2.2 函数和功能

以下是关于 QHash 常用函数及其功能的总结:

函数功能
insert(const Key &key, const T &value)QHash 中插入键值对。
insertMulti(const Key &key, const T &value)QHash 中插入允许相同键的多个值。
remove(const Key &key)移除指定键的元素。
value(const Key &key) const返回指定键的值。
contains(const Key &key) const判断是否包含指定键。
isEmpty() const判断 QHash 是否为空。
size() const返回 QHash 中键值对的数量。
clear()清空 QHash 中的所有元素。
keys() const返回 QHash 中所有键的列表。
values() const返回 QHash 中所有值的列表。
begin()返回指向 QHash 开始位置的迭代器。
end()返回指向 QHash 结束位置的迭代器。
constBegin() const返回指向 QHash 开始位置的常量迭代器。
constEnd() const返回指向 QHash 结束位置的常量迭代器。
find(const Key &key) const返回指向 QHash 中指定键的迭代器。
count(const Key &key) const返回指定键的数量。
unite(const QHash &other)合并两个 QHash,将 other 中的元素合并到当前 QHash
intersect(const QHash &other)保留两个 QHash 中共有的元素,删除其他元素。
subtract(const QHash &other)从当前 QHash 中移除与 other 共有的元素。
toStdHash() constQHash 转换为 std::unordered_map

这些函数提供了对 QHash 中键值对的插入、删除、查找和遍历等操作。根据需求选择适当的函数以满足操作要求。

1.2.3 应用案例

QHashQMap其实是一样的,如果不需要对键值对进行排序那么使用QHash将会得到更高的效率,正是因为Hash的无序,才让其具备了更加高效的处理能力。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QHash>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QHash<QString, QString> hash;hash["1001"] = "admin";hash["1002"] = "guest";hash.insert("1003", "lyshark");hash.insert("1004", "lucy");// hash.remove("1002");// 根据键值对查询属性std::cout << hash["1002"].toStdString().data() << std::endl;std::cout << hash.value("1003").toStdString().data() << std::endl;std::cout << hash.key("admin").toStdString().data() << std::endl;// 使用STL语法迭代枚举Hash键值对QHash<QString, QString>::const_iterator x;for (x = hash.constBegin(); x != hash.constEnd(); ++x){std::cout << x.key().toStdString().data() << " : ";std::cout << x.value().toStdString().data() << std::endl;}// 使用STL语法实现修改键值对QHash<QString, QString>::iterator write_x;write_x = hash.find("1003");if (write_x != hash.end())write_x.value() = "you are in";// 使用Qt中自带的foreach遍历键值对QString each;// --> 单循环遍历foreach (const QString &each, hash.keys()){std::cout << hash.value(each).toStdString().data() << std::endl;}// --> 多循环遍历foreach (const QString &each, hash.uniqueKeys()){foreach (QString x, hash.values(each)){std::cout << each.toStdString().data() << " : ";std::cout << x.toStdString().data() << std::endl;}}return a.exec();
}

这里需要说明一点,与QMap一样,QHash也能够使用QMultiHash其操作上与QMultiMap保持一致,此处读者可自行尝试。

1.3 QSet

QSet 是 Qt 中的无序关联容器,类似于 C++ 标准库的 std::unordered_set。它主要用于存储唯一值,而不关心元素的顺序。以下是关于 QSet 的概述:

1.3.1 特点和用途

  • 无序性: QSet 中的元素是无序的,没有特定的排列顺序。
  • 唯一值: 每个值在 QSet 中是唯一的,不允许重复值。
  • 性能: 适用于需要快速查找和检索唯一值的场景,性能比有序容器(如 QMap)更高。
  • 底层实现: 使用哈希表实现,因此插入和查找操作的平均复杂度是 O(1)。

1.3.2 函数和功能

以下是关于 QSet 常用函数及其功能的总结:

函数功能
insert(const T &value)QSet 中插入元素。
contains(const T &value) const判断是否包含指定元素。
remove(const T &value)移除指定元素。
isEmpty() const判断 QSet 是否为空。
size() const返回 QSet 中元素的数量。
clear()清空 QSet 中的所有元素。
unite(const QSet &other)合并两个 QSet,将 other 中的元素合并到当前 QSet
intersect(const QSet &other)保留两个 QSet 中共有的元素,删除其他元素。
subtract(const QSet &other)从当前 QSet 中移除与 other 共有的元素。
begin()返回指向 QSet 开始位置的迭代器。
end()返回指向 QSet 结束位置的迭代器。
constBegin() const返回指向 QSet 开始位置的常量迭代器。
constEnd() const返回指向 QSet 结束位置的常量迭代器。

这些函数提供了对 QSet 中元素的插入、删除、查找和遍历等操作。QSet 是一个无序容器,用于存储唯一的元素。根据需求选择适当的函数以满足操作要求。

1.3.3 应用案例

QSet 集合容器,是基于散列表(哈希表)的集合模板,存储顺序同样不定,查找速度最快,其内部使用QHash实现。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QSet>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSet<QString> set;set << "dog" << "cat" << "tiger";// 测试某值是否包含于集合if(set.contains("cat")){std::cout << "include" << std::endl;}return a.exec();
}

1.4 嵌套案例总结

1.4.1 QList与QMap组合

代码通过结合使用 QListQMap 实现了数据的嵌套存储。具体而言,通过在 QMap 中存储键值对,其中键是时间字符串,而值是包含浮点数数据的 QList。这种结构使得可以方便地按时间检索相关联的数据集。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QtGlobal>
#include <QList>
#include <QMap>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QMap<QString,QList<float>> map;QList<float> ptr;// 指定第一组数据ptr.append(10.1);ptr.append(12.5);ptr.append(22.3);map["10:10"] = ptr;// 指定第二组数据ptr.clear();ptr.append(102.2);ptr.append(203.2);ptr.append(102.1);map["11:20"] = ptr;// 输出所有的数据QList<float> tmp;foreach(QString each,map.uniqueKeys()){tmp = map.value(each);std::cout << "Time: " << each.toStdString().data() << std::endl;for(qint32 x=0;x<tmp.count();x++){std::cout << tmp[x]<< std::endl;}}return a.exec();
}

在示例中,两组数据分别对应不同的时间键,每组数据存储在相应的 QList 中。最后,通过迭代输出了所有数据,以时间为键检索相应的数据集,并将每个数据集中的浮点数逐个输出。整体而言,这种数据结构的嵌套使用有助于组织和检索多维度的数据。

1.4.2 QList合并为QMap

通过使用 QList 存储头部信息(Header)和相应的数值信息(Values),然后通过循环迭代将两个列表合并为一个 QMap。在这个 QMap 中,头部信息作为键,而数值作为相应的值,形成了一个键值对应的字典结构。最后,通过 QMap 的键值对操作,输出了特定字典中的数据。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QtGlobal>
#include <QList>
#include <QMap>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QList<QString> Header = {"MemTotal","MemFree","Cached","SwapTotal","SwapFree"};QList<float> Values = {12.5,46.8,68,100.3,55.9};QMap<QString,float> map;// 将列表合并为一个字典for(int x=0;x<Header.count();x++){QString head = Header[x].toStdString().data();float val = Values[x];map[head] = val;}// 输出特定字典中的数据std::cout << map.key(100.3).toStdString().data() << std::endl;std::cout << map.value("SwapTotal") << std::endl;return a.exec();
}

整体而言,这样的数据结构使得能够更方便地按照特定的头部信息检索相应的数值。

1.4.3 QMap拆分为QList

这段代码演示了如何使用 QMap 存储键值对,并分别将键和值存储到两个 QList 中。首先,通过 Display 函数输出了 QMap 中的键值对。

接着,通过 map.keys()map.values() 分别获取 QMap 中的所有键和值,将它们存储到两个 QList 中,并使用循环分别输出了这两个列表的内容。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QtGlobal>
#include <QList>
#include <QMap>void Display(QMap<QString,float> map)
{foreach(const QString &each,map.uniqueKeys()){std::cout << each.toStdString().data() << std::endl;std::cout << map.value(each) << std::endl;}
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QMap<QString,float> map;map["MemTotal"] = 12.5;map["MemFree"] = 32.1;map["Cached"] = 19.2;Display(map);QList<QString> map_key;QList<float> map_value;// 分别存储起来map_key = map.keys();map_value = map.values();// 输出所有的key值for(int x=0;x<map_key.count();x++){std::cout << map_key[x].toStdString().data() << std::endl;}// 输出所有的value值for(int x=0;x<map_value.count();x++){std::cout << map_value[x] << std::endl;}return a.exec();
}

1.4.4 QList结构体排序

实现对包含结构体 MyStructQList 进行排序,并输出排序后的结果。首先,定义了一个包含整数的 QList,通过 std::sort 函数按从大到小的顺序对该列表进行排序,并使用 Display 函数输出排序后的结果。

其次,定义结构体 MyStruct,其中包含两个成员变量 uuiduname。创建一个存储该结构体的 QList,并添加了几个结构体对象。通过 devListSort 函数,以结构体的 uuid 成员进行排序,并使用循环输出排序后的结果。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QtGlobal>
#include <QList>struct MyStruct
{int uuid;QString uname;
};void Display(QList<int> ptr)
{foreach(const int &each,ptr)std::cout << each << " ";std::cout << std::endl;
}// 由大到小排列
int compare(const int &infoA,const int &infoB)
{return infoA > infoB;
}// 针对结构体的排序方法
void devListSort(QList<MyStruct> *list)
{std::sort(list->begin(),list->end(),[](const MyStruct &infoA,const MyStruct &infoB){return infoA.uuid < infoB.uuid;});
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 定义并对单一数组排序QList<int> list = {56,88,34,61,79,82,34,67,88,1};std::sort(list.begin(),list.end(),compare);Display(list);// 定义并对结构体排序QList<MyStruct> list_struct;MyStruct ptr;ptr.uuid=1005;ptr.uname="admin";list_struct.append(ptr);ptr.uuid=1002;ptr.uname = "guest";list_struct.append(ptr);ptr.uuid = 1000;ptr.uname = "lyshark";list_struct.append(ptr);devListSort(&list_struct);for(int x=0;x< list_struct.count();x++){std::cout << list_struct[x].uuid << " ---> ";std::cout << list_struct[x].uname.toStdString().data() << std::endl;}return a.exec();
}

上述这段代码演示了如何对一个包含整数的列表和一个包含结构体的列表进行排序,并输出排序后的结果。在结构体排序的情况下,使用了自定义的排序方法 devListSort,该方法按照结构体的 uuid 成员进行升序排序。

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

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

相关文章

AI:大模型技术

Prompt Prompt&#xff08;提示&#xff09;是一种在人工智能领域&#xff0c;特别是在自然语言处理和聊天机器人中常用的技术。它是一种输入&#xff0c;用于激发人工智能模型生成相应的输出。在聊天机器人中&#xff0c;用户输入的问题或请求就是提示&#xff0c;而聊天机器…

基于AidLux的工业视觉少样本缺陷检测实战应用

1. 模型转换 AIMO网站&#xff1a; http://aimo.aidlux.com/ 试用账号和密码&#xff1a; 账号&#xff1a;AIMOTC001 &#xff0c;密码&#xff1a;AIMOTC001 上传模型选择目标平台参数设置选择自动转换转换结果并下载 2. 基于AidLux的语义分割模型部署 dataset2aidlux文件…

期待一下elasticsearch还未发布的8.12版本,由lucene底层带来的大幅度提升

现在是北京时间23年12月10日。当前es最新版本还是es8.11版本。我们可以期待一下不久的将来&#xff0c;es的8.12版本看到大幅度的检索性能提升。受益于 Lucene 9.9版本&#xff0c;内核带来的大幅提升&#xff01; 此次向量检索利用底层指令fma会性能提升5%。并且还提供了向量点…

在Spring Cloud使用Hystrix核心组件,并注册到Eureka注册中心去

其实吧&#xff0c;写Spring Cloud系列&#xff0c;我有时候觉得也挺难受的&#xff0c;因为Spring Cloud的微服务启动都需要一个一个来&#xff0c;并且在IDea中也需要占用比较大的内存&#xff0c;并且我本来可以一篇写完5大核心组件的&#xff0c;但是我却分了三篇&#xff…

简单的图像分类任务全流程示例(内含代码)

以下是一个简单的示例&#xff0c;展示了如何使用 PyTorch 处理自定义图像分类数据集&#xff1a; import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torch.utils.data import DataLoad…

erlang实现用ets做一级缓存

一、Erlang中的ETS表和DETS表 ETS表是Erlang中的一种数据结构&#xff0c;它允许我们在内存中存储数据。ETS表有许多用途&#xff0c;其中包括作为缓存的一种实现方式。ETS表的特点是它们在内存中以表的形式存储数据&#xff0c;这使得访问和操作数据非常快。 DETS表是Erlang…

【求职】外企德科-网易游戏测试面试记录

前面的话&#xff1a;本来没想写&#xff0c;但是竟然收到了一面通过的通知&#xff0c;那就来回顾一下一面&#xff0c;为终面做做准备。 这次面试基本没有做什么准备&#xff0c;本来也就是抱着试一试的心态做的笔试&#xff0c;结果笔试通过了&#xff0c;由于笔试的内容很…

LINUX-ROS集成安装MQTT库步骤注意事项

环境信息 roottitan-ubuntu1:/home/mogo/data/jp/paho.mqtt.cpp# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic 步骤 安装doxygen sudo apt install doxygen 构…

Fcopy: 基于Coke实现内网大文件分发

在工作中&#xff0c;我曾与小伙伴讨论过这样一个实际问题&#xff1a;数据制作流程产生了一份需要上线的文件&#xff0c;而线上有数十台甚至上百台机器&#xff0c;有什么朴素的办法以尽可能快的速度将文件分发到指定的机器上吗&#xff1f;根据作者已有的知识&#xff0c;分…

普冉(PUYA)单片机开发笔记(5): 配置定时器PWM输出

概述 定时器的输出通道作为 PWM 驱动是 MCU 的常用功能。 PY32F003 有一个高级定时器 TIM1 和一个通用定时器 TIM3&#xff0c;这两个定时器都可以驱动4个输出通道。现在我们就利用 TIM1 的某一个通道实现可控占空比的 PWM 输出。 原理简介 看数据手册&#xff0c;简单摘录…

激活函数数学详解以及应用场景解释

文章目录 激活函数1. Sigmoid 激活函数例子及推导过程代码 2. ReLU 激活函数例子及推导过程 3. Tanh 激活函数例子及推导过程代码 4. Softmax 激活函数例子及推导过程代码 CNN 中的卷积层工作原理卷积计算过程卷积后的输出及 ReLU 应用 激活函数 激活函数在神经网络中扮演着至…

IPSec 协议

在 TCP/IP 协议中&#xff0c;对 IP 数据包没有提供任何安全保护&#xff0c;攻击者可以通过网络嗅探、 IP 欺骗、连接截获等方法来攻击正常的 TCP/IP 通信。因此&#xff0c;通信过程中会存在以下危险&#xff1a;数据并非来自合法的发送者、数据在传输过程中被非法篡改、信息…

前端知识(十七)——入口函数和特定函数的区别

入口函数和特定函数是编程中常见的两种函数类型&#xff0c;它们在功能和使用场景上有所不同。下面我将通过Python代码示例来解释它们的区别。 1.入口函数&#xff1a;入口函数通常是一个程序或模块的起始点&#xff0c;它负责接收用户输入或外部数据&#xff0c;并启动程序的…

DM8/达梦 数据库管理员使用手册详解

1.1DM客户端存放位置 Windows&#xff1a;DM数据库安装目录中tool文件夹和bin文件夹中。 Linux&#xff1a;DM数据库安装目录中tool目录和bin目录中。 1.2DM数据库配置助手 1.2.1Windows创建数据库 打开数据库配置助手dbca 点击创建数据库实例 选择一般用途 浏览选择数据库…

图中的最长环

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是处于什么原因&#xff0c;算法学习需要持续保持&#xff0c;今天让我们一起来看看这一道题目————图中的最长环&#xff0c;图论题目中比较常见的环路…

vite+TypeScript+vue3+router4+Pinia+ElmPlus+axios+mock项目基本配置

1.viteTSVue3 npm create vite Project name:... yourProjectName Select a framework:>>Vue Select a variant:>>Typescrit2. 修改vite基本配置 配置 Vite {#configuring-vite} | Vite中文网 (vitejs.cn) vite.config.ts import { defineConfig } from vite …

C语言笔试例题_指针专练30题(附答案解析)

C语言笔试例题_指针专练30题(附答案解析) 指针一直是C语言的灵魂所在&#xff0c;是掌握C语言的必经之路&#xff0c;收集30道C语言指针题目分享给大家&#xff0c;测试环境位64位ubuntu18.04环境&#xff0c;如有错误&#xff0c;恳请指出&#xff0c;文明讨论&#xff01;&am…

基于SSM+JSP网上订餐管理系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

Flask笔记三之连接使用数据库

本文首发于公众号&#xff1a;Hunter后端 原文链接&#xff1a;Flask笔记三之连接使用数据库 这一节介绍 Flask 与数据库的连接&#xff0c;以及接口里查询数据的操作。 这里使用的是 SQLAlchemy pymysql 实现与数据库的连接&#xff0c;SQLAlchemy 的详细介绍见之前的笔记有…

蓝桥杯2021年5月青少组Python程序设计国赛真题

30 个人在一条船上,超载&#xff0c;需要 15 人下船于是人们排成一队&#xff0c;排队的位置即为他们的编号。报数,从1开始,数到9的人下船。如此循环,直到船上仅剩15 人为止&#xff0c;问都有哪些编号的人下船了呢? 2】判断101-200之间有多少个素数&#xff0c;并输出所有素数…