C++学习笔记——标准模板库

目录

 一、简介

二、STL概述

2.1STL是什么?

2.2STL的优势

三、容器(Containers)

3.1序列式容器(Sequence Containers)

3.2关联式容器(Associative Containers)

3.3容器适配器(Container Adapters)

四、算法(Algorithms)

4.1常见的算法分类

4.1.1一个使用STL算法对vector进行排序的示例代码

五、迭代器(Iterators)

5.1下面是一个使用迭代器遍历vector的示例代码

六、函数对象(Functors)

6.1下面是一个使用函数对象对vector进行排序的示例代码

七、分配器(Allocators)

7.1下面是一个使用自定义分配器的示例代码

七、STL扩展和补充


上一篇文章链接:

C++ 是一门功能强大的编程语言,它提供了很多工具来实现各种编程任务。在本文中,我们将介绍 C++ 中的三个重要概念:友元、嵌套类和异常。

C++学习笔记——友元、嵌套类、异常-CSDN博客文章浏览阅读20次。友元、嵌套类和异常是 C++ 中三个重要的概念,它们可以提高程序的灵活性、封装性和健壮性。但是,需要注意的是过度使用它们会破坏程序的封装性、增加代码的复杂度和影响程序的性能。因此,在编写程序时,应根据实际情况选择适当的编程技术来提高程序的可读性、可维护性和可靠性。https://blog.csdn.net/m0_62338174/article/details/135573148?spm=1001.2014.3001.5502

 

 一、简介

    C++标准模板库(STL)是C++的一个重要组成部分,它提供了一套丰富的通用数据结构和算法。STL以其高度模块化、可复用的特性,在C++编程中发挥着重要作用。本篇博客将带你深入了解STL,并介绍其常见的组件和使用方法。

二、STL概述

2.1STL是什么?

C++标准模板库(STL)是C++语言的一个标准库,它提供了一套通用的数据结构和算法,以支持高效的编程。STL的设计目标是使程序员能够以简洁、高效和可复用的方式开发代码。

2.2STL的优势

STL的优势在于其高度模块化和可复用性。它提供了一系列容器、算法和迭代器等组件,这些组件可以独立于特定问题进行开发和测试,并且可以通过简单的组合来解决复杂的问题。此外,STL的算法和数据结构都经过了高度优化,因此在性能方面具有很大优势。

三、容器(Containers)

3.1序列式容器(Sequence Containers)

序列式容器是一种线性结构,它按照元素的插入顺序来存储和访问数据。常见的序列式容器包括vector、deque和list等。这些容器提供了灵活的内存管理和高效的元素访问。

3.2关联式容器(Associative Containers)

关联式容器是一种基于键值对存储和访问数据的数据结构。常见的关联式容器包括set、map和multimap等。这些容器提供了高效的数据检索和排序功能。

3.3容器适配器(Container Adapters)

容器适配器是一种特殊的容器,它们通过改变底层容器的接口或行为来提供不同的功能。常见的容器适配器有栈(stack)和队列(queue)等。它们通常基于vector或deque实现,提供了特定的数据访问方式。

四、算法(Algorithms)

常用算法概述 STL提供了丰富的算法,涵盖了排序、搜索、变换、合并等各种常见操作。这些算法可以应用于不同的容器,并且具有良好的可组合性和可重用性。

算法分类 STL的算法可以根据其操作对象进行分类。

4.1常见的算法分类

包括修改序列、非修改序列、排序、堆算法等。

使用STL算法的示例代码 下面是

4.1.1一个使用STL算法对vector进行排序的示例代码

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = {5, 2, 9, 1, 7};

    // 使用STL算法对vector排序
    std::sort(nums.begin(), nums.end());

    // 输出排序后的结果
    for (const auto& num : nums) {
        std::cout << num << " ";
    }

    return 0;
}

五、迭代器(Iterators)

迭代器的作用和分类 迭代器是STL中用于遍历容器元素的工具。它提供了一种统一的访问元素的方式,使得算法可以独立于容器而工作。常见的迭代器类型包括输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。

迭代器的使用示例

5.1下面是一个使用迭代器遍历vector的示例代码

#include <iostream>
#include <vector>

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};

    // 使用迭代器遍历vector并输出元素
    for (auto it = nums.begin(); it != nums.end(); ++it) {
        std::cout << *it << " ";
    }

    return 0;
}

六、函数对象(Functors)

函数对象的概念和作用 函数对象是一种行为类似函数的对象,它可以被当做函数来调用。在STL中,函数对象通常用于作为算法的参数,用于指定特定的操作。

函数对象的使用示例

6.1下面是一个使用函数对象对vector进行排序的示例代码

#include <iostream>
#include <vector>
#include <algorithm>

struct Compare {
    bool operator()(int a, int b) const {
        return a > b;
    }
};

int main() {
    std::vector<int> nums = {5, 2, 9, 1, 7};

    // 使用函数对象对vector排序
    std::sort(nums.begin(), nums.end(), Compare());

    // 输出排序后的结果
    for (const auto& num : nums) {
        std::cout << num << " ";
    }

    return 0;
}

七、分配器(Allocators)

分配器的作用和使用方法 分配器用于管理容器的内存分配和释放。STL提供了默认的分配器,但也允许用户自定义分配器以满足特定需求。

自定义分配器的示例代码

7.1下面是一个使用自定义分配器的示例代码

#include <iostream>
#include <vector>
#include <memory>

template<typename T>
struct MyAllocator {
    using value_type = T;

    MyAllocator() = default;

    template<typename U>
    MyAllocator(const MyAllocator<U>&) {}

    T* allocate(std::size_t n) {
        return static_cast<T*>(::operator new(n * sizeof(T)));
    }

    void deallocate(T* p, std::size_t n) {
        ::operator delete(p);
    }
};

int main() {
    std::vector<int, MyAllocator<int>> nums(5);

    // 输出vector的大小
    std::cout << "Size: " << nums.size() << std::endl;

    return 0;
}

七、STL扩展和补充

C++11/14/17对STL的扩展 C++11、C++14和C++17标准对STL进行了扩展,引入了新的容器、算法和功能。例如,C++11引入了移动语义和右值引用,C++14引入了变长模板参数等。

Boost库和其他STL补充 Boost库是一个广泛使用的C++库,它提供了大量的扩展和补充STL的组件,包括智能指针、多线程支持、正则表达式和网络编程等。除此之外,还有其他第三方库也提供了对STL的补充和增强功能。

      STL是C++中一个强大而灵活的工具,它提供了一套丰富的容器、算法和迭代器等组件,可以大大简化C++程序的开发过程。通过学习STL的使用方法和特性,我们可以更加高效地编写可靠、可维护的C++代码。希望本篇博客能够为读者提供有关STL的全面介绍和实践指导,以帮助读者充分发挥STL在项目中的作用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

轻松批量重命名不同路径文件:从1到N的单独编号指南

在处理大量文件时&#xff0c;有时要批量重命名这些文件。整理、归档或是进行其他类型的处理。但不同的文件可能位于不同的路径下&#xff0c;增加了批量重命名的复杂性。下面来看云炫文件管理器如何批量重命名不同路径下的文件&#xff0c;从1到N单独编号的方法。 不同路径文件…

考研经验总结——目录

文章目录 一、写作顺序二、个人情况说明三、读评论四、一些小牢骚五、一些注意事项&#xff08;持续更新&#xff09; 一、写作顺序 我将准备从三个阶段开始介绍吧 考研前考研中考研后&#xff08;也就是现在我的这种情况&#xff09; 考研前我会分为&#xff1a;数学、专业…

三轴加速度计LIS2DW12开发(3)----检测活动和静止状态

e2studio开发三轴加速度计LIS2DW12.3--检测活动和静止状态 概述视频教学样品申请源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()…

vue3+vite开发生产环境区分

.env.development VITE_APP_TITLE本地.env.production VITE_APP_TITLE生产-ts文件中应用 console.log(import.meta.env.VITE_APP_TITLE)在html中应用&#xff0c;需要安装 html 模板插件 pnpm add vite-plugin-html -Dvite.config.ts中 import { createHtmlPlugin } from v…

python|切片

切片的语法格式 object[start_index:end_index:step] &#xff08;1&#xff09;step步长&#xff1a;有正负&#xff0c;正表示正着走&#xff0c;负表示负着走&#xff0c;步长的绝对值代表一步走的距离。 &#xff08;其中&#xff0c;在深度学习中卷积也有步长的说法&…

从比特币、以太坊生态,到AI与新公链复兴,谁将接棒2024年的主流叙事?

2023年10月份至今&#xff0c;现货比特币ETF一直都是促使市场反弹的核心叙事之一&#xff0c;如今靴子终于落地&#xff0c;那在ETF预期尘埃落定的大背景下&#xff0c;接下来的加密市场有哪些赛道值得关注&#xff1f; 泛比特币生态 2023年比特币生态浪潮中&#xff0c;OKX等赢…

什么是数通技术?以太网交换机在数通技术中的精要

什么是数通技术&#xff1f; 数通技术是指数字通信技术&#xff0c;它涵盖了数字信号处理、数据传输、网络通信等领域。通信工程师在数通技术中负责设计、建设和维护数字通信系统&#xff0c;以实现可靠、高效的信息传输。这涉及到数字信号的编解码、调制解调、数据压缩、网络…

【论文解读】SiamMAE:用于从视频中学习视觉对应关系的 MAE 简单扩展

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://siam-mae-video.github.io/resources/paper.pdf 项目主页&#xff1a;https://siam-mae-video.github.io/ 1.背景 时间是视觉学习背景下的一个特殊维度&#xff0c;它提供了一…

QT上位机开发(加密和解密)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 加密和解密是我们在软件开发中经常遇到的一种情形。最早的时候&#xff0c;加密是用在军事上面。现在由于各个行业、各个公司之间的竞争也非常激烈…

Kafka的安装、管理和配置

Kafka的安装、管理和配置 1.Kafka安装 官网: https://kafka.apache.org/downloads 下载安装包,我这里下载的是https://archive.apache.org/dist/kafka/3.3.1/kafka_2.13-3.3.1.tgz Kafka是Java生态圈下的一员&#xff0c;用Scala编写&#xff0c;运行在Java虚拟机上&#xf…

不会 python 语言没关系,GPT 会呀

在日常办公或者是编程过程中&#xff0c;经常要处理一些琐碎的任务。就拿编程来说&#xff0c;假如你现在收到一个任务&#xff0c;要提取源代码中所有的字符串&#xff0c;进行国际化。 一般来说&#xff0c;很多软件开发工具提供了国际化方案&#xff0c;比如 QT&#xff0c;…

x-cmd pkg | fx - Warp 支持的 JSON 查看和处理工具

目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 fx 是一款由专为 JSON 定制的双用途命令行工具&#xff0c;提供基于终端的 JSON 查看器和 JSON 处理实用程序。虽然 JSON 查看器是用 Go 编写的&#xff0c;并且无需外部依赖即可运行&#xff0c;但 JSON 处理工具是用…

openGauss学习笔记-196 openGauss 数据库运维-常见故障定位案例-强制结束指定的问题会话

文章目录 openGauss学习笔记-196 openGauss 数据库运维-常见故障定位案例-强制结束指定的问题会话196.1 强制结束指定的问题会话196.1.1 问题现象196.1.2 处理办法 openGauss学习笔记-196 openGauss 数据库运维-常见故障定位案例-强制结束指定的问题会话 196.1 强制结束指定的…

实验室服务器升级

cuda、python、pytorch 版本兼容查看顺序及网站 任务&#xff1a; 在一个有GPU的电脑上安装pytorch时选择合适版本。 简述&#xff1a; 安装 pytorch 时&#xff0c;若要使用 GPU&#xff0c;需要考虑与 CUDA&#xff0c;python 的版本兼容情况。推荐考虑顺序&#xff1a;CUD…

NUS CS1101S:SICP JavaScript 描述:四、元语言抽象

原文&#xff1a;4 Metalinguistic Abstraction 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 …魔法就在于文字——Abracadabra&#xff0c;开门&#xff0c;以及其他——但一个故事中的魔法词在另一个故事中并不神奇。真正的魔法是理解哪些词起作用&#xff0c;何时…

Jenkins创建maven项目

Jenkins创建maven项目 环境准备 如果在项目没有看到maven&#xff0c;需要下载插件 本机需要有maven&#xff0c;并且maven配置过国内镜像&#xff0c;否则很大概率插件下不下来&#xff0c;如果有docker之前没有配置过需要进入docker手动配置。 需要在全局中配置maven的set…

Kubernetes (十一) 存储——Secret配置管理

一. 简介 从文件创建 echo -n admin > ./username.txt echo -n westos > ./password.txt kubectl create secret generic db-user…

力扣(leetcode)第606题根据二叉树创建字符串(Python)

606.根据二叉树创建字符串 题目链接&#xff1a;606.根据二叉树创建字符串 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 “()” 表示&…

【大数据】Flink 详解(九):SQL 篇 Ⅱ

本系列包含&#xff1a; 【大数据】Flink 详解&#xff08;一&#xff09;&#xff1a;基础篇【大数据】Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅰ【大数据】Flink 详解&#xff08;三&#xff09;&#xff1a;核心篇 Ⅱ【大数据】Flink 详解&#xff08;四…

第十六章 i18n国际化

第十六章 i18n国际化 1.什么是i18n国际化2.i18n国际化三要素介绍3.i18n国际化基础示例4.通过请求头实现国际化5.通过语言类型选择实现国际化6.通过JSTL标签库fmt实现国际化 1.什么是i18n国际化 2.i18n国际化三要素介绍 3.i18n国际化基础示例 如果我要准备一个国际化的信息&…