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

C++与现代开发实践第二课:C++标准库(STL)深入

 

第四章:C++与现代开发实践

第二课:C++标准库(STL)深入
1. STL容器与算法的全面讲解
1.1 STL的基本概念

C++标准模板库(STL)是C++的一项核心特性,为程序员提供了一个高效且灵活的方式来处理数据结构和算法。STL的设计理念是“泛型编程”,允许使用通用的接口和数据类型,以减少代码的重复和增加代码的复用性。STL主要包括三部分:

  1. 容器:用于存储数据的对象,例如 vectorlistmap 等。
  2. 算法:对容器中的数据执行操作的函数,例如排序、查找等。
  3. 迭代器:用于遍历容器的对象,提供了一种统一的方式来访问容器元素。

通过使用STL,开发者可以在提高代码可读性的同时,增强程序的性能。

1.2 STL容器的详细分类

STL容器大致分为以下几类,每类容器有其特定的使用场景和特点:

  • 序列容器:包括 vectordequelist

    • vector:动态数组,支持随机访问,适合频繁插入和删除操作的末尾。
    • deque:双端队列,支持在两端快速插入和删除,适合需要频繁在两端操作的场景。
    • list:双向链表,适合频繁插入和删除操作,但不支持随机访问。
  • 关联容器:包括 setmapunordered_setunordered_map

    • set:存储唯一值的集合,自动排序。
    • map:键值对集合,支持按键查找。
    • unordered_setunordered_map:基于哈希表实现,查找效率更高,但不保证顺序。
  • 适配器容器:如 stackqueuepriority_queue

    • stack:后进先出(LIFO)结构。
    • queue:先进先出(FIFO)结构。
    • priority_queue:元素按照优先级进行访问。
1.3 STL算法的深入解析

STL算法是针对容器中元素的操作,标准库提供了大量的算法,主要包括:

  • 排序算法:如 sort()stable_sort()
  • 查找算法:如 find()binary_search()
  • 变换算法:如 transform()copy()
  • 聚合算法:如 accumulate()for_each()

例如,使用 sort()vector 进行排序:

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {4, 2, 3, 1, 5};std::sort(vec.begin(), vec.end());std::cout << "Sorted vector: ";for (const auto& num : vec) {std::cout << num << " ";}return 0;
}
1.4 迭代器的使用与优势

迭代器是STL的重要组成部分,它提供了一种统一的方式来访问容器中的元素。迭代器的类型包括:

  • 输入迭代器:只能读取数据。
  • 输出迭代器:只能写入数据。
  • 前向迭代器:可以读写数据,且只能向前移动。
  • 双向迭代器:可以向前和向后移动。
  • 随机访问迭代器:支持任意位置的快速访问。

例如,使用迭代器遍历 list

#include <iostream>
#include <list>int main() {std::list<int> lst = {1, 2, 3, 4, 5};for (auto it = lst.begin(); it != lst.end(); ++it) {std::cout << *it << " ";}return 0;
}
2. 复杂数据操作的实例
2.1 项目背景与需求

在进行大数据分析时,处理复杂数据的能力至关重要。我们的目标是创建一个系统,能够从用户输入中提取信息并进行处理。为此,我们将利用STL的强大功能来存储和处理这些数据。

2.2 使用mapvector存储数据

我们可以使用 map 存储用户信息,vector 存储特定属性(如评分、评论等):

#include <iostream>
#include <map>
#include <vector>struct UserInfo {std::string username;std::vector<int> ratings;UserInfo(const std::string& name) : username(name) {}
};
2.3 操作用户信息

以下是对用户信息进行插入和查询的示例:

int main() {std::map<std::string, UserInfo> userDatabase;// 插入用户信息UserInfo user1("Alice");user1.ratings.push_back(5);userDatabase[user1.username] = user1;UserInfo user2("Bob");user2.ratings.push_back(3);userDatabase[user2.username] = user2;// 查询用户信息auto it = userDatabase.find("Alice");if (it != userDatabase.end()) {std::cout << "User: " << it->second.username << ", Ratings: ";for (const auto& rating : it->second.ratings) {std::cout << rating << " ";}std::cout << std::endl;}return 0;
}
2.4 复杂数据操作的实现

我们需要实现对用户评分的统计和排序功能。首先定义一个函数计算平均评分:

double calculateAverageRating(const UserInfo& user) {double sum = 0;for (int rating : user.ratings) {sum += rating;}return sum / user.ratings.size();
}

接着实现按平均评分排序的功能:

#include <algorithm>
#include <iostream>
#include <vector>std::vector<std::pair<std::string, double>> sortUsersByRating(const std::map<std::string, UserInfo>& users) {std::vector<std::pair<std::string, double>> averages;for (const auto& pair : users) {double avgRating = calculateAverageRating(pair.second);averages.emplace_back(pair.first, avgRating);}std::sort(averages.begin(), averages.end(),[](const auto& a, const auto& b) { return a.second > b.second; });return averages;
}
2.5 实例展示

在主函数中调用以上函数,并展示排序后的结果:

int main() {std::map<std::string, UserInfo> userDatabase;// (插入用户信息的代码...)// 按评分排序auto sortedUsers = sortUsersByRating(userDatabase);std::cout << "Users sorted by average rating:\n";for (const auto& entry : sortedUsers) {std::cout << "User: " << entry.first << ", Average Rating: " << entry.second << std::endl;}return 0;
}
3. 使用STL进行实际项目开发的案例(续)
3.1 项目背景与目标(续)

在构建图书管理系统时,除了基本的书籍信息管理,我们还需要处理用户借阅图书的功能。通过STL,我们可以进一步扩展项目,增加借阅和归还图书的操作。

3.2 借阅管理的设计

我们将扩展 Library 类,增加借阅和归还书籍的功能:

class Library {
public:void addBook(const Book& book) {books.push_back(book);}bool borrowBook(const std::string& title, const std::string& username) {auto it = std::find_if(books.begin(), books.end(),[&title](const Book& book) { return book.title == title; });if (it != books.end()) {borrowedBooks[username].push_back(*it);books.erase(it);return true;}return false;}void returnBook(const std::string& title, const std::string& username) {auto it = borrowedBooks.find(username);if (it != borrowedBooks.end()) {auto& userBooks = it->second;auto bookIt = std::find_if(userBooks.begin(), userBooks.end(),[&title](const Book& book) { return book.title == title; });if (bookIt != userBooks.end()) {books.push_back(*bookIt);userBooks.erase(bookIt);}}}void displayBorrowedBooks(const std::string& username) const {auto it = borrowedBooks.find(username);if (it != borrowedBooks.end()) {std::cout << "Books borrowed by " << username << ":\n";for (const auto& book : it->second) {std::cout << "Title: " << book.title << ", Author: " << book.author << ", Rating: " << book.rating << std::endl;}} else {std::cout << "No borrowed books found for " << username << ".\n";}}private:std::vector<Book> books;std::map<std::string, std::vector<Book>> borrowedBooks;
};
3.3 借阅与归还操作的实现

main 函数中,我们展示如何使用这些功能:

int main() {Library library;// 添加书籍library.addBook(Book("C++ Primer", "Lippman", 4.8));library.addBook(Book("Effective C++", "Scott Meyers", 4.7));// 借阅书籍library.borrowBook("C++ Primer", "Alice");library.displayBorrowedBooks("Alice");// 归还书籍library.returnBook("C++ Primer", "Alice");library.displayBorrowedBooks("Alice");return 0;
}

在这个示例中,我们演示了借阅书籍、查看借阅情况以及归还书籍的操作。

3.4 扩展功能:罚款管理

为了增强系统的实用性,我们还可以添加罚款管理功能,计算逾期未还的图书罚款:

double calculateFine(const std::string& username, const std::vector<Book>& overdueBooks) {double totalFine = 0.0;for (const auto& book : overdueBooks) {totalFine += 1.0;  // 每本逾期图书罚款1.0}return totalFine;
}

在这个函数中,我们计算用户未按时归还的图书所需支付的罚款。


3.5 完整示例展示

最终,在 main 函数中,结合所有功能,展示完整的书籍管理系统:

int main() {Library library;// 添加书籍library.addBook(Book("C++ Primer", "Lippman", 4.8));library.addBook(Book("Effective C++", "Scott Meyers", 4.7));// 借阅书籍library.borrowBook("C++ Primer", "Alice");library.displayBorrowedBooks("Alice");// 归还书籍library.returnBook("C++ Primer", "Alice");library.displayBorrowedBooks("Alice");// 罚款计算示例std::vector<Book> overdueBooks = { Book("C++ Primer", "Lippman", 4.8) };double fine = calculateFine("Alice", overdueBooks);std::cout << "Total fine for Alice: $" << fine << std::endl;return 0;
}

小结

在本课中,我们深入探讨了C++标准库(STL),包括容器和算法的详细用法以及复杂数据操作的实例。通过构建实际项目案例,我们展示了STL在开发过程中的强大功能和灵活性。这不仅提高了代码的可维护性,还增强了开发效率。掌握STL的使用将为你在C++编程的旅程中打下坚实的基础。


http://www.mrgr.cn/news/56713.html

相关文章:

  • Java方法重载
  • 大模型之三十二-语音合成TTS(coqui) 之二 fine-tune
  • 在 Windows 环境下,Git 默认会自动处理 CRLF 和 LF 之间的转换。
  • 飞凌嵌入式FET527N-C核心板已适配OpenHarmony4.1
  • 群晖通过 Docker 安装 MySQL
  • HCIP-HarmonyOS Application Developer 习题(十五)
  • 【C#】不需要连接数据库使用 ADO.NET 实现数据绑定
  • 人工智能--数学基础
  • AIGC文本生成3D模型
  • 模型的参数化和非参数化是什么?
  • 常见的css选择器汇总
  • 管家婆ERP集成用友好业财(管家婆主供应链)
  • 机器视觉运动控制一体机在DELTA并联机械手视觉上下料应用
  • HBuilderX离线打包Android
  • 会话管理——Cookie
  • vue常用的修饰符作用与使用场景总结
  • 云上大数据架构是什么?
  • 已集成工作流引擎的低代码平台(源码获取,JAVA,Vue)
  • WPF LiveChart控件基础属性介绍
  • 代码随想录算法训练营第五天| 哈希表理论基础 454.四数相加II 383.赎金信 15.三数之和 18.四数之和
  • 【C++】STL----map和set
  • RAD Studio 12.2 Athens Inline Patch 1 已可下载更新
  • 在嵌入式开发领域,有哪些好用的国产工具?
  • vllm源码解析(六):采样策略分析
  • Kafka-Windows搭建全流程(环境,安装包,编译,消费案例,远程连接,服务自启,可视化工具)
  • 【运维自动化-作业平台】如何使用全局变量之主机列表类型?