【C++】STL的基本用法

news2024/11/20 0:43:50

目录结构


1. STL概念

1.2 常见容器

1.3 六大组件

2.  STL容器之vector

1. vector

2. 基本用法示例

3. STL容器之map

1. map

2. 基本用法示例


1. STL概念

C++中的STL是指标准模板库的缩写。STL提供了一组通用的模板类和函数,用于实现常见的数据结构和算法,如向量(vector)、链表(list)、栈(stack)、队列(queue)、映射(map)等,以及包括排序、搜索、算法等在内的各种算法操作。

1.2 常见容器

  1. vector:动态数组,支持快速随机访问。
  2. list:双向链表,支持高效插入和删除操作。
  3. stack:栈,后进先出(LIFO)数据结构。
  4. queue:队列,先进先出(FIFO)数据结构。
  5. map:映射,键-值对的关联容器。

1.3 六大组件

  1. 容器(Containers):容器是STL的核心组件之一,提供了各种数据结构,如向量(vector)、链表(list)、双端队列(deque)、栈(stack)、队列(queue)、映射(map)等。容器用于存储和组织数据,不同类型的容器适用于不同的数据访问和操作需求。

  2. 算法(Algorithms):STL包含了一系列通用算法,用于操作容器中的数据,例如排序、查找、复制、变换等。这些算法是高度优化的,可适用于不同类型的容器,使开发人员能够更轻松地进行常见操作。

  3. 迭代器(Iterators):迭代器是用于访问容器中元素的通用接口。它们提供了统一的方法来遍历容器,并使算法能够与不同类型的容器一起使用,而不需要了解底层容器的细节。

  4. 仿函数(Function Objects):仿函数是可调用对象,它们在STL中用于执行特定操作,如排序或变换。STL提供了一些内置的仿函数,同时也允许开发人员定义自己的仿函数,以满足特定需求。

  5. 适配器(Adapters):适配器是用于修改或扩展容器和迭代器行为的组件。STL中包括一些适配器,如栈适配器(stack adapter)和队列适配器(queue adapter),它们基于其他容器提供了不同的接口。

  6. 配置器(Allocators):配置器用于管理内存分配和释放,以支持容器的底层数据结构。STL提供了默认的配置器,同时也允许开发人员自定义配置器以满足特定的内存管理需求。

2.  STL容器之vector

1. vector

std::vector 是 C++ 标准库提供的一个动态数组容器,它可以自动扩展和收缩,使其非常适合存储和管理可变数量的元素。

2. 基本用法示例

2.1 包含头文件

#include <vector>

2.2 创建一个空的 std::vector

std::vector<int> myVector;

2.3 向 std::vector 中添加元素

myVector.push_back(42);
myVector.push_back(23);
myVector.push_back(17);

2.4 访问 std::vector 中的元素

int firstElement = myVector[0];
int secondElement = myVector[1];

2.5 获取 std::vector 的大小

int size = myVector.size();

2.6 遍历 std::vector 中的元素

for (int i = 0; i < myVector.size(); i++) {
    std::cout << myVector[i] << " ";
}

2.7 使用范围循环遍历 std::vector

for (int value : myVector) {
    std::cout << value << " ";
}

2.8 插入元素到指定位置

myVector.insert(myVector.begin() + 1, 100);  // 在第二个位置插入值为100的元素

2.9 删除元素

myVector.erase(myVector.begin() + 1);  // 删除第二个元素

2.10 清空 std::vector

myVector.clear();

2.11 示例程序

创建了一个 std::vector,向其中添加、插入、删除元素,并最后清空了 std::vector

#include <iostream>
#include <vector>

int main() {
    // 创建一个空的 std::vector,用于存储整数
    std::vector<int> myVector;

    // 向 std::vector 中添加一些整数元素
    myVector.push_back(42);
    myVector.push_back(23);
    myVector.push_back(17);

    // 遍历并打印 std::vector 中的元素
    for (int value : myVector) {
        std::cout << value << " ";
    }

    std::cout << std::endl;

    // 在第二个位置插入值为100的元素
    myVector.insert(myVector.begin() + 1, 100);

    // 再次遍历并打印 std::vector 中的元素
    for (int value : myVector) {
        std::cout << value << " ";
    }

    std::cout << std::endl;

    // 删除第二个元素
    myVector.erase(myVector.begin() + 1);

    // 再次遍历并打印 std::vector 中的元素
    for (int value : myVector) {
        std::cout << value << " ";
    }

    std::cout << std::endl;

    // 清空 std::vector
    myVector.clear();

    // 打印 std::vector 的大小(应该为0)
    std::cout << "Vector size: " << myVector.size() << std::endl;

    return 0;
}

2.12 std::vector 的简化版源码示例

该简化的 MyVector 类模拟了 std::vector 的基本功能,包括动态数组的管理、元素的添加、访问和扩容等。

#include <iostream>
#include <stdexcept>

template <typename T>
class MyVector {
private:
    T* data;        // 存储元素的数组
    size_t size;    // 当前元素数量
    size_t capacity; // 数组容量

public:
    // 构造函数
    MyVector() : data(nullptr), size(0), capacity(0) {}

    // 析构函数
    ~MyVector() {
        delete[] data; // 释放内存
    }

    // 返回元素数量
    size_t Size() const {
        return size;
    }

    // 添加元素到尾部
    void PushBack(const T& value) {
        if (size == capacity) {
            // 如果容量不足,扩展数组
            if (capacity == 0) {
                capacity = 1; // 初始容量为1
            } else {
                capacity *= 2; // 容量翻倍
            }
            T* newData = new T[capacity];
            for (size_t i = 0; i < size; ++i) {
                newData[i] = data[i];
            }
            delete[] data;
            data = newData;
        }
        data[size] = value; // 添加元素
        size++;
    }

    // 访问元素
    T& operator[](size_t index) {
        if (index < size) {
            return data[index];
        } else {
            throw std::out_of_range("Index out of range");
        }
    }
};

int main() {
    MyVector<int> myVector;

    myVector.PushBack(42);
    myVector.PushBack(23);
    myVector.PushBack(17);

    for (size_t i = 0; i < myVector.Size(); i++) {
        std::cout << myVector[i] << " ";
    }

    return 0;
}

3. STL容器之map

1. map

在C++的STL(标准模板库)中,std::map 是一种关联式容器,用于存储键-值对。它按照键的顺序进行排序,并且具有快速查找功能。

2. 基本用法示例

1. 包含头文件

#include <map>

2. 创建一个空的 std::map

std::map<std::string, int> myMap;

3. 向 std::map 中插入键值对

myMap["Alice"] = 25;
myMap["Bob"] = 30;
myMap["Charlie"] = 35;

4. 访问 std::map 中的值

int age = myMap["Alice"];

5. 使用迭代器遍历 std::map 中的键值对

for (const auto& pair : myMap) {
    std::cout << "Name: " << pair.first << ", Age: " << pair.second << std::endl;
}

6. 检查 std::map 中是否包含特定的键

if (myMap.find("Alice") != myMap.end()) {
    std::cout << "Alice is in the map." << std::endl;
}

7. 示例程序示例程序创建了一个 std::map,向其中添加键值对,访问键值对的值,并检查特定的键是否存在。

#include <iostream>
#include <map>
#include <string>

int main() {
    // 创建一个空的 std::map,用于存储名字和年龄的关联关系
    std::map<std::string, int> myMap;

    // 向 std::map 中插入键值对
    myMap["Alice"] = 25;
    myMap["Bob"] = 30;
    myMap["Charlie"] = 35;

    // 使用迭代器遍历 std::map 中的键值对
    for (const auto& pair : myMap) {
        std::cout << "Name: " << pair.first << ", Age: " << pair.second << std::endl;
    }

    // 访问特定键的值
    int age = myMap["Alice"];
    std::cout << "Alice's age is " << age << std::endl;

    // 检查特定键是否存在于 std::map 中
    if (myMap.find("Alice") != myMap.end()) {
        std::cout << "Alice is in the map." << std::endl;
    }

    return 0;
}

以下是 std::map的简化版源码示例,用于说明其基本工作原理。

std::map 是 C++ 标准库提供的关联容器,它实际上是一个基于红黑树的有序关联容器,用于存储键值对,并能够按键的排序顺序进行访问。这个简化的 MyMap 类模拟了 std::map 的一些基本功能,包括插入和查找键值对。在实际的 std::map 实现中,还包括了红黑树平衡操作等,以确保高效的键值对查找和维护有序性。

#include <iostream>
#include <string>

template <typename Key, typename Value>
class MyMap {
private:
    struct Node {
        Key key;
        Value value;
        Node* left;
        Node* right;
        Node* parent;
        bool isRed; // 红黑树节点颜色标志
    };

    Node* root; // 根节点

    // 插入节点的内部辅助函数
    void InsertNode(Node*& node, const Key& key, const Value& value) {
        if (node == nullptr) {
            node = new Node{key, value, nullptr, nullptr, nullptr, true};
            // 红黑树插入后需要修复
            // (在实际的 std::map 实现中,这里包括了平衡操作,以确保树的平衡性)
        } else {
            if (key < node->key) {
                InsertNode(node->left, key, value);
            } else if (key > node->key) {
                InsertNode(node->right, key, value);
            } else {
                // 如果键已存在,更新值
                node->value = value;
            }
        }
    }

    // 查找节点的内部辅助函数
    Node* FindNode(const Key& key, Node* node) {
        if (node == nullptr || key == node->key) {
            return node;
        }
        if (key < node->key) {
            return FindNode(key, node->left);
        } else {
            return FindNode(key, node->right);
        }
    }

public:
    MyMap() : root(nullptr) {}

    // 插入键值对
    void Insert(const Key& key, const Value& value) {
        InsertNode(root, key, value);
    }

    // 查找键对应的值
    Value Find(const Key& key) {
        Node* node = FindNode(key, root);
        if (node != nullptr) {
            return node->value;
        } else {
            // 返回默认值,可以根据需求修改
            return Value();
        }
    }
};

int main() {
    MyMap<std::string, int> myMap;

    myMap.Insert("Alice", 25);
    myMap.Insert("Bob", 30);
    myMap.Insert("Charlie", 35);

    int age = myMap.Find("Alice");
    std::cout << "Alice's age is " << age << std::endl;

    return 0;
}

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

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

相关文章

Clickhouse学习笔记(3)—— Clickhouse表引擎

前言&#xff1a; 有关Clickhouse的前置知识详见&#xff1a; 1.ClickHouse的安装启动_clickhouse后台启动_THE WHY的博客-CSDN博客 2.ClickHouse目录结构_clickhouse 目录结构-CSDN博客 Cickhouse创建表时必须指定表引擎 表引擎&#xff08;即表的类型&#xff09;决定了&…

【MATLAB源码-第75期】基于模拟退火算法(SA)的栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 模拟退火算法是一种启发式优化算法&#xff0c;通常用于解决组合优化问题&#xff0c;例如旅行商问题和图着色问题。它模拟了固体材料在退火过程中逐渐冷却达到稳定状态的行为&#xff0c;以寻找问题的全局最优解。 以下是模…

【MATLAB源码-第76期】基于模拟退火算法(SA)的无人机三维地图路径规划,输出最短路径和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 模拟退火算法是一种启发式优化算法&#xff0c;通常用于解决组合优化问题&#xff0c;例如旅行商问题和图着色问题。它模拟了固体材料在退火过程中逐渐冷却达到稳定状态的行为&#xff0c;以寻找问题的全局最优解。 以下是模…

Unity 场景优化策略

Unity 场景优化策略 GPU instancing 使用GPU Instancing可以将多个网格相同、材质相同、材质属性可以不同的物体合并为一个批次&#xff0c;从而减少Draw Calls的次数。这可以提高性能和渲染效率。 GPU instancing可用于绘制在场景中多次出现的几何体&#xff0c;例如树木或…

软件工程的舞台上,《人月神话》的美学纷飞

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天给大家分享一本书&#xff1a;《人月神话》——软件工程的经典之作。 《人月神话》是一本具有深远影响力的软件工程著作&#xff0c;无论是软件开发者、管理者还是学习软件工程的人士&#xff0c;都能从中获得宝贵的启…

电脑想要微信多开——打开多个微信的必胜法宝!

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.11.11 Last edited: 2023.11.11 导读&#xff1a;在生活当中经常遇到工作和生活相撞的事情&#xff0c;导致在处理私人的事情同时不得不处理…

redis学习指南--概览篇

redis怎么学 官方学习网站&#xff1a; redis.cn 1、整体了解redis redis是一个内存数据库、kv数据库&#xff0c;数据结构数据库&#xff0c;redis中数据都是存储在redis中&#xff0c;可以通过key查找value&#xff0c;value可以有多种数据结构&#xff0c;有&#xff1a;…

牛客、赛码网OJ调试(全)

现在无论开发还是测试&#xff0c;面试的时候都需要考察代码能力。 从测试的职业发展来看&#xff0c;现在市场上对于纯功能测试的需求很少&#xff0c;招聘方均要求面试者一方面具备测试基础能力&#xff0c;也要求有点代码能力。 对于测试来说&#xff0c;除了测试开发&#…

C语言计算字符串中数字字符的个数

文章目录 1-9题前言例题10例题11答案例题10答案答案1答案2 例题11答案 1-9题 C语言基础例题1-3题-指针篇 C语言基础例题4-5题-二维数组篇 C语言基础例题6-7题-结构体篇 C语言基础例题8-9题-大作业篇 前言 下列题目需要学习字符串、指针后才可练习。 例题10 请编写一个程序…

【Java】I/O流—转换流、序列化流的初学者指南及RandomAccessFile类

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;我不在意你曾堕落&#xff0c;我只在意你是否会崛起 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录…

【算法与设计模式】

一、数据结构与算法 1、算法性能评估 时间复杂度、空间复杂度 2、数据结构 数组与列表 队列 堆栈 链表 二叉树 多叉树 递归算法 二、设计模式 1、单例 &#xff08;1&#xff09;GIL&#xff1a;线程互斥锁。保证同一时刻只有一个线程在进行。 &#xff08;2&#xff09…

嵌入式CTS测试

1.概述 CTS是一套开源测试套件&#xff0c;可以实现对OpenGL、ES、OpenCL、Vulkan的兼容性测试。OpenGL ES CTS的测试集&#xff0c;其测试用例涵盖了各种OpenGL ES 的功能和特性。这些功能包括着色器编译和链接、图元绘制、纹理操作、帧缓冲操作、深度测试、模板测试以及其他一…

中国智能驾驶的“突围赛”打响,这家本土厂商为何能成为“先行者”?

中国本土厂商正在成为全球智能汽车产业链的“核心力量”。 根据《高工智能汽车研究院》数据显示&#xff0c;今年1-6月&#xff0c;自主品牌标配L2&#xff08;含L2&#xff09;级辅助驾驶交付新车155.34万辆。其中&#xff0c;搭载中国本土智能驾驶解决方案提供商&#xff08…

Clickhouse 学习笔记(6)—— ClickHouse 分片集群

前置知识&#xff1a; Clickhouse学习笔记&#xff08;5&#xff09;—— ClickHouse 副本-CSDN博客 与副本对比&#xff1a; 副本虽然能够提高数据的可用性&#xff0c;降低丢失风险&#xff0c;但是每台服务器实际上必须容纳全量数据&#xff0c;对数据的横向扩容没有解决 …

自适应AI chatGPT智能聊天创作官网html源码/最新AI创作系统/ChatGPT商业版网站源码

源码简介&#xff1a; 自适应AI chatGPT智能聊天创作官网html源码&#xff0c;这是最新AI创作系统&#xff0c;作为ChatGPT商业版网站源码&#xff0c;它是支持创作、编写、翻译、写代码等。是一个智能聊天系统项目源码。 注意&#xff1a;这个只是网站html源码&#xff0c;要…

leetcode 刷题 - 有效三角形个数 - 长度最小的子数组 - 无重复字符的最长子串

l611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1:输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3示…

【vue】vue项目批量下载二维码,且打包成压缩包.

一. 先看效果演示 二. 下插件 npm i vue-qr -S // 二维码显示插件 我的版本^4.0.9 npm i html2canvas -S // 将二维码转为图片 我的版本^1.4.1 npm i file-saver -S // 下载图片 我的版本^2.0.5 npm i jszip -S // 打包成压缩包 我的版本^3.10.1 // 一次性下载 npm i vue-qr h…

利用中断做数码表

功能要求:1.按下KEY1&#xff0c;显示数字开始每0.5秒加1&#xff0c;加到&#xff08;10学号&#xff09;返回0&#xff0c;0显示2秒后继续开始重复加1。 2. 任何时候按下KEY2数字清零&#xff0c;并停止加1。 3. KEY1和KEY2分别采用查询和外部中断方式。 要求程序中有硬件…

最新宝塔面板第三方云端站点程序源码/第三方宝塔面板PHP源码/全开源ThinkPHP框架

源码简介&#xff1a; 实现宝塔面板第三方云端站点程序源码,这个是第三方宝塔面板 btcloud PHP源码&#xff0c;它还有云端使用记录、IP黑白名单、定时任务等功能。 这是一个使用PHP开发的宝塔面板第三方云端站点程序。 您可以利用此程序搭建属于自己的宝塔面板第三方云端&a…

Springboot+vue的高校办公室行政事务管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校办公室行政事务管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的高校办公室行政事务管理系统&#xff0c;采用M&#xff08;m…