【C++风云录】从SQLite到Redis:探索C++与多种数据库的交互之道

开启数据库之旅:通过C++与各种数据库交互,事半功倍

数据库操作:介绍与应用

前言

在现代软件开发中,数据库扮演着至关重要的角色,用于存储和管理大量的数据。为了更有效地操作数据库,开发人员常常依赖于专门的数据库操作库。本文将介绍几个常用的C++库,用于在C++应用程序中与不同类型的数据库进行交互。

欢迎订阅专栏:C++风云录

文章目录

  • 开启数据库之旅:通过C++与各种数据库交互,事半功倍
    • 数据库操作:介绍与应用
      • 前言
      • 1. SQLite
        • 1.1 简介
        • 1.2 特点
        • 1.3 使用场景
        • 1.4 C++ 接口示例
      • 2. MySQL Connector/C++
        • 2.1 简介
        • 2.2 特点
        • 2.3 使用场景
        • 2.4 C++ 接口示例
      • 3. PostgreSQL
        • 3.1 简介
        • 3.2 特点
        • 3.3 使用场景
        • 3.4 C++ 接口示例
      • 4. MongoDB C++ Driver
        • 4.1 简介
        • 4.2 特点
        • 4.3 使用场景
        • 4.4 C++ 接口示例
      • 5. Redis C++ Client
        • 5.1 简介
        • 5.2 特点
        • 5.3 使用场景
        • 5.4 C++ 接口示例
      • 6. SQLiteCpp
        • 6.1 简介
        • 6.2 特点
        • 6.3 使用场景
        • 6.4 C++ 接口示例
      • 总结

1. SQLite

1.1 简介

SQLite是一个嵌入式关系型数据库管理系统,提供了一个轻量级的C++接口。它是一个开源的软件库,无需配置服务器或安装管理工具,可以直接在程序中使用。SQLite支持标准的SQL语法,并提供了许多高级功能,如事务处理、索引、触发器等。

1.2 特点
  • 轻量级:SQLite的代码库非常小巧,只有几百KB大小,适合嵌入到各种应用程序中。
  • 高性能:SQLite在数据处理和查询方面表现出色,可以快速处理大量数据。
  • 可移植性:SQLite可以运行在多个操作系统上,包括Windows、Linux、macOS等。
  • 零配置:SQLite无需配置服务器或安装管理工具,直接在程序中使用即可。
  • 支持事务处理:SQLite支持ACID(原子性、一致性、隔离性、持久性)事务处理,保证数据的完整性和一致性。
1.3 使用场景

SQLite适用于以下场景:

  • 嵌入式系统:由于SQLite的轻量级和零配置特点,适合在嵌入式系统中使用,如移动设备、物联网设备等。
  • 桌面应用程序:SQLite可以嵌入到桌面应用程序中,用于存储和管理用户数据。
  • 测试和原型开发:SQLite可以提供一个快速、简单的数据库解决方案,用于测试和原型开发阶段。
1.4 C++ 接口示例

以下示例展示了如何使用SQLite的C++接口来创建一个包含两个字段的表,并插入一条记录:

#include <iostream>
#include <sqlite3.h>int main() {sqlite3* db;int result = sqlite3_open(":memory:", &db);if (result != SQLITE_OK) {std::cerr << "Cannot open database: " << sqlite3_errmsg(db) << std::endl;return result;}const char* query = "CREATE TABLE Customers (id INT, name TEXT);";result = sqlite3_exec(db, query, NULL, NULL, NULL);if (result != SQLITE_OK) {std::cerr << "Error creating table: " << sqlite3_errmsg(db) << std::endl;return result;}query = "INSERT INTO Customers (id, name) VALUES (1, 'John Doe');";result = sqlite3_exec(db, query, NULL, NULL, NULL);if (result != SQLITE_OK) {std::cerr << "Error inserting record: " << sqlite3_errmsg(db) << std::endl;return result;}sqlite3_close(db);return 0;
}

以上代码首先打开一个内存数据库(:memory:),然后使用sqlite3_exec函数执行SQL语句来创建表和插入记录。最后,关闭数据库连接。在实际应用中,可以替换内存数据库为磁盘文件数据库或其他数据库连接方式。

2. MySQL Connector/C++

2.1 简介

MySQL Connector/C++是MySQL官方提供的C++接口库,用于与MySQL数据库进行交互。该库提供了一系列的类和方法,可以方便地进行数据库的连接、查询、插入、删除等操作。MySQL Connector/C++可以运行在多个操作系统上,并且与MySQL数据库服务器之间通过网络进行通信。

2.2 特点
  • 官方支持:MySQL Connector/C++由MySQL官方提供和维护,保证了其稳定性和兼容性。
  • 高性能:通过与MySQL数据库服务器之间的网络通信,可以实现高效的数据传输和查询。
  • 安全性:MySQL Connector/C++支持使用SSL加密连接,保护数据库的数据安全。
  • 多平台支持:MySQL Connector/C++可以运行在多个操作系统上,包括Windows、Linux、macOS等。
2.3 使用场景

MySQL Connector/C++适用于以下场景:

  • Web开发:可以使用MySQL Connector/C++来连接和操作MySQL数据库,存储和管理网站的数据。
  • 服务器应用程序:MySQL Connector/C++可以用于开发服务器应用程序,处理和存储大量数据。
  • 数据分析和报表生成:通过连接MySQL数据库并使用MySQL Connector/C++进行数据查询和分析,可以生成各种报表和数据分析结果。
2.4 C++ 接口示例

以下示例展示了如何使用MySQL Connector/C++来连接MySQL数据库,并执行一个简单的查询:

#include <mysql_driver.h>
#include <mysql_connection.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>int main() {sql::mysql::MySQL_Driver *driver;sql::Connection *con;driver = sql::mysql::get_mysql_driver_instance();con = driver->connect("tcp://127.0.0.1:3306", "username", "password");sql::Statement *stmt;sql::ResultSet *res;stmt = con->createStatement();res = stmt->executeQuery("SELECT * FROM Customers");while (res->next()) {std::cout << "ID: " << res->getInt("id");std::cout << ", Name: " << res->getString("name") << std::endl;}delete res;delete stmt;delete con;return 0;
}

以上代码使用MySQL Connector/C++连接到数据库服务器,并执行一个简单的查询语句来获取Customers表中的数据。通过循环遍历结果集,打印出每条记录的ID和姓名。在实际应用中,需要替换"tcp://127.0.0.1:3306"为正确的MySQL服务器地址,以及"username""password"为正确的用户名和密码。

3. PostgreSQL

3.1 简介

PostgreSQL是一个功能强大的开源关系型数据库管理系统,提供了一个稳定可靠的C++接口。它支持标准的SQL语法,并提供了许多高级功能,如事务处理、并发控制、视图、触发器等。PostgreSQL具有良好的性能和可扩展性,可以处理大量数据并支持并发访问。

3.2 特点
  • 可靠性:PostgreSQL使用写前日志(WAL)技术来保证数据的持久性,即使发生故障或崩溃,也能保证数据的完整性。
  • 扩展性:PostgreSQL支持水平和垂直扩展,可以通过添加更多服务器和调整配置来提高系统的处理能力。
  • 多版本并发控制:PostgreSQL使用多版本并发控制(MVCC)来处理并发访问,实现高并发的读写操作。
  • 支持JSON和XML数据类型:PostgreSQL支持存储和查询JSON和XML数据类型,方便处理复杂的数据结构。
  • 可编程性:PostgreSQL支持存储过程、触发器和用户定义的函数,可以在数据库内部实现复杂的业务逻辑。
3.3 使用场景

PostgreSQL适用于以下场景:

  • Web应用程序:由于其高性能和可靠性,PostgreSQL常用于Web应用程序的后端数据库,存储和管理大量数据。
  • 数据分析和科学计算:PostgreSQL支持复杂的查询和分析操作,可以用于数据分析和科学计算领域。
  • 地理信息系统(GIS):PostgreSQL提供了丰富的地理信息处理功能,适用于地理信息系统(GIS)应用。
  • 对象关系映射(ORM)框架:很多ORM框架支持使用PostgreSQL作为后端数据库,方便开发和管理对象模型。
3.4 C++ 接口示例

以下示例展示了如何使用PostgreSQL的C++接口来连接到数据库,并执行一个简单的查询:

#include <iostream>
#include <pqxx/pqxx>int main() {try {pqxx::connection conn("host=localhost port=5432 user=postgres password=your_password dbname=mydatabase");if (conn.is_open()) {std::cout << "Connected to PostgreSQL!" << std::endl;pqxx::work txn(conn);pqxx::result result = txn.exec("SELECT * FROM customers");for (auto row : result) {std::cout << "ID: " << row[0].as<int>();std::cout << ", Name: " << row[1].as<std::string>() << std::endl;}txn.commit();} else {std::cout << "Failed to connect to PostgreSQL" << std::endl;}conn.disconnect();} catch (std::exception &e) {std::cerr << e.what() << std::endl;}return 0;
}

以上代码使用pqxx库连接到PostgreSQL数据库,并执行一个简单的查询语句来获取customers表中的数据。通过循环遍历结果集,打印出每条记录的ID和姓名。在实际应用中,需要将连接参数中的hostportuserpassworddbname替换为正确的值。

4. MongoDB C++ Driver

4.1 简介

MongoDB C++ Driver是MongoDB官方提供的C++接口库,用于与MongoDB数据库进行交互。该库提供了一系列的类和方法,可以方便地进行数据库的连接、查询、插入、删除等操作。MongoDB是一个非关系型数据库,以文档的形式存储数据,具有灵活的数据结构和高效的数据访问能力。

4.2 特点
  • 强大的查询语言:MongoDB使用强大且灵活的查询语言来进行数据查询,支持高级查询操作,如聚合、索引、地理位置等。
  • 高性能:MongoDB C++ Driver通过与MongoDB数据库服务器之间的网络通信,实现高效的数据传输和查询。同时,MongoDB的数据存储和查询机制也使其具备出色的性能。
  • 可扩展性:MongoDB具有良好的可扩展性,可以水平扩展到多台服务器上来处理大规模的数据。
  • 操作灵活性:MongoDB的文档模型非常灵活,可以根据应用需求随时调整和修改数据结构。
  • 支持复制和故障恢复:MongoDB支持数据复制和故障恢复机制,提供了高可用性和容错能力。
4.3 使用场景

MongoDB C++ Driver适用于以下场景:

  • Web应用程序:由于其高性能和灵活性,MongoDB常用于Web应用程序的后端数据库,存储和管理结构化和非结构化数据。
  • 日志和事件存储:MongoDB的文档模型适合存储日志和事件数据,便于快速查询和分析。
  • 实时分析和报表生成:MongoDB支持高级查询和聚合操作,适用于实时分析和报表生成的需求。
  • 物联网应用:MongoDB的可扩展性和灵活性使其适用于物联网应用程序,存储海量的传感器和设备数据。
4.4 C++ 接口示例

以下示例展示了如何使用MongoDB C++ Driver来连接MongoDB数据库,并执行一个简单的查询:

#include <iostream>
#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/stdx.hpp>
#include <bsoncxx/json.hpp>
#include <bsoncxx/builder/stream/document.hpp>int main() {mongocxx::instance instance{};mongocxx::client client{mongocxx::uri{}};mongocxx::database db = client["mydatabase"];mongocxx::collection coll = db["customers"];bsoncxx::builder::stream::document query_builder;bsoncxx::document::value query_value = query_builder.view();auto cursor = coll.find(query_value.view());for (auto&& doc : cursor) {std::cout << bsoncxx::to_json(doc) << std::endl;}return 0;
}

以上代码使用mongocxx库连接到MongoDB数据库,并执行一个简单的查询语句来获取customers集合中的数据。通过循环遍历游标对象,打印出每个文档的JSON表示。在实际应用中,需要替换连接URL中的数据库名称和集合名称,以及构建查询语句来实现具体的查询需求。

5. Redis C++ Client

5.1 简介

Redis C++ Client是Redis官方提供的C++接口库,用于与Redis数据库交互。Redis是一个高性能的键值存储数据库,具有快速的读写操作和高并发处理能力。Redis C++ Client提供了一系列的类和方法,方便进行与Redis数据库的连接、数据读写、发布订阅等操作。

5.2 特点
  • 简单易用:Redis C++ Client提供了简单易用的接口,可以方便地进行Redis数据库的操作。
  • 高性能:Redis是内存中的数据存储系统,拥有快速的读写操作和高并发处理能力。
  • 支持多种数据类型:Redis支持多种数据类型,包括字符串、哈希、列表、集合等,能够满足不同数据存储需求。
  • 发布订阅机制:Redis具有强大的发布订阅机制,可以实现实时消息传递和事件通知功能。
  • 持久化支持:Redis支持数据持久化机制,可以将数据保存到磁盘上,保证数据的持久性。
5.3 使用场景

Redis C++ Client适用于以下场景:

  • 缓存:由于Redis具有快速的读写操作和高并发能力,常用于缓存层,提高数据访问速度。
  • 会话存储:Redis可以将会话数据保存在内存中,提供快速的会话管理功能。
  • 分布式锁:Redis支持分布式锁机制,可以在多个进程或线程之间实现互斥访问控制。
  • 实时数据分析:Redis的发布订阅机制可用于实时数据分析和事件通知。
  • 计数器和排行榜:Redis的原子操作和有序集合功能可用于创建计数器和排行榜。
5.4 C++ 接口示例

以下示例展示了如何使用Redis C++ Client来连接到Redis数据库,并执行一个简单的读取和写入操作:

#include <iostream>
#include <sw/redis++/redis++.h>int main() {try {sw::redis::Redis redis("tcp://127.0.0.1:6379");// 写入操作redis.set("key", "value");// 读取操作std::string value = redis.get("key");std::cout << "Value: " << value << std::endl;} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;}return 0;
}

以上代码使用sw::redis库连接到Redis数据库,并执行一个简单的设置和获取操作。通过调用Redis对象的set()方法将一个键值对写入数据库,然后使用get()方法读取对应键的值。在实际应用中,需要将连接参数中的127.0.0.1:6379替换为正确的Redis服务器地址和端口。

6. SQLiteCpp

6.1 简介

SQLiteCpp是一个用于C++的现代化、轻量级的SQLite数据库访问库。它提供了简单易用的接口,使得在C++应用程序中使用SQLite数据库变得更加方便。SQLiteCpp基于C++11标准,并采用了面向对象的编程风格,使得数据库操作更加直观和易于理解。

6.2 特点
  • 轻量级:SQLiteCpp库非常小巧,只有几百KB大小,适合嵌入到各种应用程序中。
  • 简单易用:SQLiteCpp提供了简单易用的接口,封装了底层SQLite C接口的复杂性,使得数据库操作更加直观和易于理解。
  • 高性能:SQLiteCpp通过使用C++11的现代特性和优化的算法,实现了高性能的数据库操作。
  • 跨平台支持:SQLiteCpp可以运行在多个操作系统上,包括Windows、Linux、macOS等。
  • 丰富的功能:SQLiteCpp支持事务处理、并发访问、触发器、索引等高级功能。
6.3 使用场景

SQLiteCpp适用于以下场景:

  • 桌面应用程序:由于其轻量级和简单易用的特点,SQLiteCpp常用于开发桌面应用程序,用于存储和管理小规模的数据。
  • 移动应用程序:SQLiteCpp可以嵌入到移动应用程序中,用于存储和管理用户数据。
  • 嵌入式系统:由于其小巧和跨平台支持的特点,SQLiteCpp适合用于嵌入式系统中,如物联网设备、嵌入式设备等。
  • 测试和原型开发:SQLiteCpp提供了简单易用的接口,适合用于测试和原型开发阶段的数据库操作。
6.4 C++ 接口示例

以下示例展示了如何使用SQLiteCpp库来连接SQLite数据库,并执行一个简单的查询:

#include <iostream>
#include <sqlite3pp.h>int main() {try {sqlite3pp::database db("mydatabase.db");sqlite3pp::transaction xct(db);sqlite3pp::query qry(db, "SELECT * FROM Customers");for (auto it = qry.begin(); it != qry.end(); ++it) {int id;std::string name;*it >> id >> name;std::cout << "ID: " << id << ", Name: " << name << std::endl;}xct.commit();} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;}return 0;
}

以上代码使用sqlite3pp库连接到SQLite数据库,并执行一个简单的查询语句来获取Customers表中的数据。通过循环遍历查询结果,将每条记录的ID和姓名打印出来。在实际应用中,需要将连接参数中的mydatabase.db替换为正确的SQLite数据库文件名。

总结

本文介绍了几个常用的C++库,用于数据库操作。首先介绍了SQLite,作为一个轻量级的嵌入式关系型数据库管理系统,它提供了简单、高性能的C++接口。其次,MySQL Connector/C++被介绍为与MySQL数据库交互的官方接口库,具有高性能和可扩展性。然后,我们探讨了PostgreSQL,一个功能强大的开源关系型数据库管理系统,以及MongoDB C++ Driver和Redis C++ Client,用于与非关系型数据库MongoDB和键值存储数据库Redis交互。最后,我们介绍了SQLiteCpp,一个现代化、轻量级的SQLite数据库访问库。通过这些库的介绍和示例代码,读者可以更好地理解和应用这些库,提高数据库操作的效率和可靠性。

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

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

相关文章

金融数据_PySpark-3.0.3随机森林(RandomForestClassifier)实例

金融数据_PySpark-3.0.3随机森林(RandomForestClassifier)实例 随机森林 (Random Forest) 和随机森林回归 (Random Forest Regression) 都是基于集成学习的算法, 但它们在任务和输出方面存在一些关键的区别。 随机森林 (Random Forest)&#xff1a; 任务类型: 随机森林主要用…

Cisco路由器配置IPv6 Manual隧道

Cisco路由器配置IPv6 Manual隧道 IPv6与IPv4共存的方式 IPv6与IPv4共存方式大致有三种&#xff1a; 双栈&#xff1a;要求网络中所有设备均同时支持IPv4和IPv6转换&#xff1a;转换这种方式将IPv6协议的报头转换成IPv4协议报头。隧道&#xff1a;假定两个IPv6节点要使用IPv6…

flink源码编译-job提交

1、启动standalone集群的taskmanager standalone集群中的taskmanager启动类为 TaskManagerRunner 2 打开master启动类 通过 ctrln快捷键&#xff0c;找到、并打开类&#xff1a; org.apache.flink.runtime.taskexecutor.TaskManagerRunner 3 修改运⾏配置 基本完全按照mas…

RabbitMQ在云原生环境中部署和应用实践

一、RabbitMQ和云原生技术的关系 RabbitMQ是一种开源的、实现了先进的消息队列协议&#xff08;AMQP&#xff09;的消息队列软件。而云原生技术就是为在公共云、私有云以及其他各种云环境提供应用的一种方法。RabbitMQ和云原生技术在分布式系统和微服务架构中都起到了关键作用…

NIUSHOP完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本 源码免费…

腾讯云4核8G服务器性能怎么样?能用来干什么?

腾讯云4核8G服务器多少钱&#xff1f;腾讯云4核8G轻量应用服务器12M带宽租用价格646元15个月&#xff0c;活动页面 txybk.com/go/txy 活动链接打开如下图所示&#xff1a; 腾讯云4核8G服务器优惠价格 这台4核8G服务器是轻量应用服务器&#xff0c;详细配置为&#xff1a;轻量4核…

ros小问题之rosdep update time out问题

在另外一篇ROS 2边学边练系列的文章里有写碰到这种问题的解决方法&#xff08;主要参考了其他博主的文章&#xff0c;只是针对ROS 2做了些修改调整&#xff09;&#xff0c;此处单拎出来方便查找。 在ROS 2中执行rosdep update时&#xff0c;报出如下错误&#xff1a; 其实原因…

elsint报错Delete `␍`eslintprettier/prettier

一&#xff0c;原因 这篇博客写得很清楚&#xff1a;解决VSCode Delete ␍eslint(prettier/prettier)错误_vscode 删除cr-CSDN博客 还有这篇文章&#xff0c;解决办法很详细&#xff1a;滑动验证页面 二&#xff0c;解决办法 根目录下新建.prettierrc.js文件 module.exports…

谷歌AI搜索革新:探索高级搜索服务背后的未来趋势

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

vulhub中Apache Solr RemoteStreaming 文件读取与SSRF漏洞复现

Apache Solr 是一个开源的搜索服务器。在Apache Solr未开启认证的情况下&#xff0c;攻击者可直接构造特定请求开启特定配置&#xff0c;并最终造成SSRF或任意文件读取。 访问http://your-ip:8983即可查看Apache Solr后台 1.访问http://your-ip:8983/solr/admin/cores?indexI…

一致性hash问题(负载均衡原理)

一致性哈希问题 简介 一致性Hash是一种特殊的Hash算法&#xff0c;由于其均衡性、持久性的映射特点&#xff0c;被广泛的应用于负载均衡领域&#xff0c;如nginx和memcached都采用了一致性Hash来作为集群负载均衡的方案。 本文将介绍一致性Hash的基本思路&#xff0c;并讨论其…

gpt国内怎么用?最新版本来了

claude 3 opus面世后&#xff0c;这几天已经有许多应用&#xff0c;而其精确以及从不偷懒&#xff08;截止到2024年3月11日还没有偷懒&#xff09;的个性&#xff0c;也使得我们可以用它来首次完成各种需要多轮对话的尝试。 今天我们想要进行的一项尝试就是—— 如何从一个不知…

Python Django ORM使用简单的增,删,改,查

Django ORM&#xff08;对象关系映射&#xff09;是Django框架中用于与数据库交互的一个核心组件。它提供了一种方便、直观的方式来定义、查询和操作数据库中的数据。 1. 定义模型&#xff08;Model&#xff09; 首先&#xff0c;你需要通过定义模型来告诉Django你的数据应该…

正则表达式完全指南:语法、用法及JavaScript实例

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

生成器、迭代器、可迭代对象

生成器、迭代器、可迭代对象 生成器 函数体中包含yield关键字的就是生成器 把生成 器传给 next(...) 函数时&#xff0c;生成器函数会向前&#xff0c;执行函数定义体中的 下一个 yield 语句&#xff0c;返回产出的值&#xff0c;并在函数定义体的当前位置暂停。等到再次遇到n…

深度学习与神经网络:从基础到前沿

深度学习与神经网络是人工智能领域中的重要分支&#xff0c;其应用范围涵盖图像识别、语音识别、自然语言处理等多个领域&#xff0c;对于推动人工智能技术的发展具有重要意义。本文将从深度学习的基础原理开始&#xff0c;逐步探讨神经网络的结构、训练方法&#xff0c;以及在…

认识 Redis 与 分布式

Redis 官网页面 Redis官网链接 Redis 的简介 Redis 是一个在内存中存储数据的中间件 一方面用于作为数据库&#xff0c;另一方面用于作为数据缓存&#xff0c;适用于分布式系统中 Redis 基于网络&#xff0c;进行进程间通信&#xff0c;把自己内存中的变量给别的进程&#xf…

Leetcode 300. 最长递增子序列

心路历程&#xff1a; 经典的子串/子序列的DP问题&#xff0c;这道题需要按照最后一个元素包含在子序列的角度去建模比较好做。 状态&#xff1a;以nums[i]为结尾的最长严格递增子序列的长度 动作候选集&#xff1a;每一个[0, i)之间满足比nums[i]小的元素 返回值&#xff1a…

Python超市商品管理系统

系统需要用户先登录&#xff0c;再进行操作&#xff0c;其中包含一下功能菜单 1、显示商品列表 2、增加商品信息 3、删除商品 4、设置商品折扣 5、修改商品价格信息 6、退出 a、使用列表嵌套字典的方式保存用户数据&#xff08;包含用户名、密码、姓名&#xff09;&#xff1…

C#/WPF Inno Setup打包程序

Inno Setup介绍 Inno Setup 是一个免费的 Windows 安装程序制作软件。第一次发表是在 1997 年&#xff0c;现在已经更新到Inno Setup 6了。Inno Setup是一个十分简单实用的打包小工具&#xff0c;可以按照我们自己的意愿设置功能&#xff0c;稳定性也很好。 官方网址&#xff1…