当前位置:首页 » 《随便一记》 » 正文

C++学习之STL

3 人参与  2024年03月06日 17:11  分类 : 《随便一记》  评论

点击全文阅读


C++ STL的概念

C++ STL(Standard Template Library,标准模板库)是C++标准库中的一个重要组成部分,提供了丰富的通用数据结构和算法。STL包含了多个容器(如vector、list、map等),迭代器(iterator)、算法(algorithm)等组件,可以帮助开发者更高效地进行数据处理和算法实现。
在这里插入图片描述

STL的主要概念包括:

容器(Containers):STL提供了多种容器,如vector(动态数组)、list(双向链表)、map(关联数组)等,用于存储不同类型的数据。

迭代器(Iterators):迭代器允许通过统一的方式遍历容器中的元素,从而实现对容器的操作。

算法(Algorithms):STL包含了大量的通用算法,如排序、查找、复制等,可以直接应用于各种容器,并且具有高效性能和可重用性。

函数对象(Function Objects):函数对象是可调用对象,类似于函数指针,用于在算法中执行特定操作。

适配器(Adapters):STL提供了对容器和迭代器的适配器,如stack(栈)、queue(队列)、priority_queue(优先队列)等。

实际上,STL为C++程序员提供了强大的工具集,可以大大简化数据处理和算法实现的过程,提高代码的可读性和可维护性。

C++ STL:vector存放内置数据类型

在这里插入图片描述

当使用STL的vector容器来存放内置数据类型时,可以根据需求选择不同的操作和功能。下面是一些常见的使用情况和相应的代码示例:

创建一个包含int类型的vector,并添加元素:
#include <iostream>#include <vector>int main() {    std::vector<int> nums; // 创建一个存放int类型的vector    nums.push_back(1); // 添加元素到vector尾部    nums.push_back(2);    nums.push_back(3);    // 遍历打印所有元素    for (int i = 0; i < nums.size(); i++) {        std::cout << nums[i] << " ";    }    std::cout << std::endl;    return 0;}

输出结果为:1 2 3

在vector中查找指定值的元素:
#include <iostream>#include <vector>#include <algorithm>int main() {    std::vector<int> nums = {1, 2, 3, 4, 5};        // 使用find算法在vector中查找指定值    auto it = std::find(nums.begin(), nums.end(), 3);    if (it != nums.end()) {        std::cout << "元素找到了,位置为:" << std::distance(nums.begin(), it) << std::endl;    } else {        std::cout << "未找到指定元素" << std::endl;    }        return 0;}

输出结果为:元素找到了,位置为:2

使用迭代器进行遍历和修改:
#include <iostream>#include <vector>int main() {    std::vector<int> nums = {1, 2, 3, 4, 5};        // 使用迭代器遍历和修改元素    for (auto it = nums.begin(); it != nums.end(); ++it) {        // 修改当前位置的元素值        *it *= 2;    }        // 遍历打印修改后的元素    for (const auto& num : nums) {        std::cout << num << " ";    }    std::cout << std::endl;        return 0;}

输出结果为:2 4 6 8 10

这些示例展示了在存放内置数据类型的vector中进行元素添加、查找和修改的常用操作。需要注意的是,vector的大小可变,可以根据需要动态地添加或删除元素。

C++ STL:vector存放自定义数据类型

当使用STL的vector容器存放自定义数据类型时,需要注意以下几个情况,并相应提供代码示例:
在这里插入图片描述

定义自定义数据类型:

首先,要定义一个自定义数据类型,可以通过定义一个结构体或者类来实现。例如,我们定义一个名为Person的结构体,包含姓名和年龄两个成员变量:

struct Person {    std::string name;    int age;};
创建一个包含自定义数据类型的vector,并添加元素:
#include <iostream>#include <vector>struct Person {    std::string name;    int age;};int main() {    std::vector<Person> persons; // 创建一个存放Person类型的vector    Person p1{"Alice", 25}; // 创建并初始化一个Person对象    persons.push_back(p1); // 添加到vector中    persons.push_back({"Bob", 30}); // 可直接在push_back函数中创建并添加元素    // 遍历打印所有人的姓名和年龄    for (const auto& person : persons) {        std::cout << "姓名: " << person.name << ", 年龄: " << person.age << std::endl;    }    return 0;}

输出结果为:

姓名: Alice, 年龄: 25姓名: Bob, 年龄: 30
在vector中查找指定值的元素:
#include <iostream>#include <vector>#include <algorithm>struct Person {    std::string name;    int age;};int main() {    std::vector<Person> persons = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 35}};    // 使用find_if算法在vector中查找年龄大于等于30的人    auto it = std::find_if(persons.begin(), persons.end(), [](const Person& p) {        return p.age >= 30;    });    if (it != persons.end()) {        std::cout << "找到年龄大于等于30的人,姓名:" << it->name << ", 年龄:" << it->age << std::endl;    } else {        std::cout << "未找到符合条件的人" << std::endl;    }    return 0;}

输出结果为:找到年龄大于等于30的人,姓名:Bob, 年龄:30

使用迭代器进行遍历和修改:
#include <iostream>#include <vector>struct Person {    std::string name;    int age;};int main() {    std::vector<Person> persons = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 35}};    // 使用迭代器遍历和修改元素    for (auto& person : persons) {        // 修改年龄        person.age += 1;    }    // 遍历打印修改后的所有人的姓名和年龄    for (const auto& person : persons) {        std::cout << "姓名: " << person.name << ", 年龄: " << person.age << std::endl;    }    return 0;}

输出结果为:

姓名: Alice, 年龄: 26姓名: Bob, 年龄: 31姓名: Charlie, 年龄: 36

这些示例展示了在存放自定义数据类型的vector中进行元素添加、查找和修改的常见操作。需要注意的是,自定义数据类型要重载适用于该类型的运算符,例如比较运算符等,以便在算法中使用。

C++ STL:容器嵌套容器

在这里插入图片描述

在STL中,容器嵌套容器是一种常见的数据结构设计方式。它允许我们在一个容器中存放另一个容器作为其元素。下面是几个常见的容器嵌套容器的示例:

Vector嵌套vector:
#include <iostream>#include <vector>int main() {    // 创建一个嵌套vector的容器    std::vector<std::vector<int>> nestedVector;    // 创建并添加第一个内层vector    std::vector<int> innerVector1 = {1, 2, 3};    nestedVector.push_back(innerVector1);    // 创建并添加第二个内层vector    std::vector<int> innerVector2 = {4, 5, 6};    nestedVector.push_back(innerVector2);    // 遍历打印所有元素    for (const auto& innerVec : nestedVector) {        for (const auto& num : innerVec) {            std::cout << num << " ";        }        std::cout << std::endl;    }    return 0;}

输出结果为:

1 2 3 4 5 6 
Vector嵌套map:
#include <iostream>#include <vector>#include <map>int main() {    // 创建一个嵌套map的容器    std::vector<std::map<std::string, int>> nestedVectorMap;    // 创建并添加第一个内层map    std::map<std::string, int> innerMap1 = {{"apple", 1}, {"banana", 2}};    nestedVectorMap.push_back(innerMap1);    // 创建并添加第二个内层map    std::map<std::string, int> innerMap2 = {{"orange", 3}, {"grape", 4}};    nestedVectorMap.push_back(innerMap2);    // 遍历打印所有元素    for (const auto& innerMap : nestedVectorMap) {        for (const auto& pair : innerMap) {            std::cout << pair.first << ": " << pair.second << " ";        }        std::cout << std::endl;    }    return 0;}

输出结果为:

apple: 1 banana: 2 orange: 3 grape: 4 
Map嵌套vector:
#include <iostream>#include <map>#include <vector>int main() {    // 创建一个嵌套vector的容器    std::map<std::string, std::vector<int>> nestedMapVector;    // 创建并添加第一个内层vector    std::vector<int> innerVector1 = {1, 2, 3};    nestedMapVector["A"] = innerVector1;    // 创建并添加第二个内层vector    std::vector<int> innerVector2 = {4, 5, 6};    nestedMapVector["B"] = innerVector2;    // 遍历打印所有元素    for (const auto& pair : nestedMapVector) {        std::cout << pair.first << ": ";        for (const auto& num : pair.second) {            std::cout << num << " ";        }        std::cout << std::endl;    }    return 0;}

输出结果为:

A: 1 2 3 B: 4 5 6 

这些示例展示了如何在STL中创建和使用嵌套容器。嵌套容器的设计可以根据需求灵活变化,允许我们构建复杂的数据结构来满足特定的应用场景。

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/74899.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1