【C++】STL的基本用法

目录结构


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;
}

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

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

相关文章

【C/C++底层】内存分配:栈区(Stack)与堆区(Heap)

/*** poject * author jUicE_g2R(qq:3406291309)* file 底层内存分配&#xff1a;栈区(Stack)与堆区(Heap)* * language C/C* EDA Base on MVS2022* editor Obsidian&#xff08;黑曜石笔记软件&#xff09;* * copyright 2023* COPYRIGHT …

图文示例:Python程序的运行原理解读

文章目录 一、编译型语言&#xff08;C语言为例&#xff09;二、动态型语言三、程序是如何运行起来的&#xff1f;四、分析五、dir 函数六、def 指令七、pyc文件1.pyc文件三大作用 八、import 指令总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三…

软件工程分析报告05体系结构说明书——基于Paddle的肝脏CT影像分割

基于Paddle的肝脏CT影像分割系统的体系结构说明书 目录 HIPO图 H图 Ipo图 软件结构图 面向数据流的体系结构设计图 程序流程图 S图 用PDL语言描述的伪代码 HIPO图 H图 Ipo图 软件结构图 面向数据流的体系结构设计图 程序流程图 S图 PAD图 用PDL语言描述的伪代码 (1)…

【Hello Go】初识Go语言

初识Go语言 Go语言介绍Go语言是什么Go语言优势Go语言能用来做什么 Go语言环境安装第一个GO语言程序运行Go语言程序 Go语言介绍 Go语言是什么 go语言是是Google开发的一种静态强类型、编译型、并发型&#xff0c;并具有垃圾回收功能的编程语言. 静态类型&#xff1a;在静态类型…

【计算机网络】UDP协议

UDP的结构 我们学习一个协议最主要的就是理解它的报文格式&#xff0c;对于UDP协议来说 我们看下面的这张图。 16位UDP长度&#xff0c;表示整个数据报&#xff08;UDP首部UDP数据&#xff09;的最大长度。UDP报文长度占两个字节&#xff0c;16位表示的数据范围&#xff08;0-…

Java学习之路 —— Day3(内部类、枚举、泛型、API)

文章目录 1. 内部类2. 枚举3. 泛型 1. 内部类 成员内部类 就是类中的一个普通成员&#xff0c;类似普通的成员方法、成员变量。&#xff08;套娃&#xff09; public class Outer {public class Inner {private String name;public static String school;public String getNa…

爆火的迅雷网盘推广,一手云盘app拉新推广渠道必备项目 学习资料

迅雷网盘是目前几个主流网盘拉新推广之一 都可以通过”聚量推客“申请 目前主流的为&#xff1a;夸克网盘拉新、uc网盘推广、迅雷网盘&#xff0c;但是由于阿里的原因 夸克目前不对外开放名额&#xff0c;需要等待&#xff0c;取而代之主流的云盘推广就是迅雷网盘了 聚量推客…

linux基础知识

一、Linux权限详解 Linux的文件权限有以下设定&#xff1a; Linux下文件的权限类型一般包括读&#xff0c;写&#xff0c;执行。对应字母为 r、w、x。 Linux下权限的属组有 拥有者 、群组 、其它组 三种。每个文件都可以针对这三个属组&#xff08;粒度&#xff09;&#x…

bulldog靶机复现

注&#xff1a;个人笔记&#xff0c;有点简陋&#xff0c;仅供参考。 准备&#xff1a;把kali和靶机设置为同一网段&#xff08;NAT&#xff09; 信息搜集 主机扫描 nmap -sP -T4 10.4.7.0/24 扫描出靶机IP为&#xff1a;10.4.7.134 扫描端口、服务 nmap -A -T4 -p- 10.4.…

VRRP(虚拟路由器冗余协议)标准协议工作机制与优势介绍

VRRP标准协议 文章目录 VRRP标准协议简介VRRP标准协议基本概念VRRP标准协议工作机制主备选举主备倒换非抢占模式抢占模式 VRRP标准协议技术优势VRRP典型组网单备份组主备备份多备份组负载分担 推荐阅读 VRRP标准协议简介 VRRP&#xff08;Virtual Router Redundancy Protocol…

怎么阅读芯片源代码(rtl)

part one 主要的原则。 一个rtl可以是这样的&#xff1a; 经常大家习惯于算法和数据结构。对于设计的部分&#xff0c;落实不一定多。 另外一个rtl也可以是这样的&#xff1a; 所以从不同的层面来讲&#xff0c;一个Rtl有不同的表述。 首先大概把所有的部分浏览一遍&#x…

碳交易机制下考虑需求响应的综合能源系统优化运行(附带Matlab程序)

碳交易机制下考虑需求响应的综合能源系统优化运行&#xff08;附带Matlab程序&#xff09; 仿真平台&#xff1a;MATLABCPLEX 使用的是yalmipcplex求解器完成求解 资源地址&#xff1a; 碳交易机制下考虑需求响应的综合能源系统优化运行&#xff08;附带Matlab程序&#xff09…

CSRF 漏洞实战

CMS创建新用户 方法&#xff1a;攻击者可以利用 XSS 触发 CSRF 攻击。因为&#xff0c;可以利用 JS 发送 HTTP 请求。经过研究受害网站的业务流程&#xff0c;可以构造如下代码&#xff1a; 代码&#xff1a; <script> xmlhttp new XMLHttpRequest(); xmlhttp.open(&qu…

安装DevEco Studio时,遇到的ohpm报错(解决)

如上图所示&#xff0c;我试了网上的各种办法&#xff0c;包括官网的文档&#xff0c;运行init.bat也不行。 接下来我说一下我的办法&#xff1a; 我从官网下载安装包后&#xff0c;将bin文件添加在了环境变量里&#xff08;最终安装的位置&#xff0c;但是因为他会自己下载所…

【运维必看】2023年常见运维面试题汇总,助你拿下offer!

IT运维面试问题总结-基础服务、磁盘管理、虚拟平台&#xff01; 基础服务—— 1、简述Linux中常见的系统服务&#xff0c;其作用分别是&#xff1f; 常见的系统服务及其作用有&#xff1a; ●NTP/Chrony&#xff1a;用于时钟同步&#xff1b; ●DHCP&#xff1a;动态主机配…

MySQL(16):变量、流程控制与游标

变量 在MySQL数据库的存储过程和函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据。 在 MySQL 数据库中&#xff0c;变量分为 系统变量 以及 用户自定义变量 。 系统变量 变量由系统定义&#xff0c;不是用户定义&#xff…

软件工程分析报告04详细设计说明书——基于Paddle的肝脏CT影像分割

基于Paddle的肝脏CT影像分割系统的详细设计说明书 一、引言 本文档是基于Paddle的肝脏CT影像分割系统的详细设计说明书。本文档旨在对系统的设计、实现以及测试等方面进行详细的阐述&#xff0c;以便于开发人员进行开发和测试工作。 二、概述 肝脏CT影像分割系统是一种医疗影像…

Learning reliable modal weight with transformer for robust RGBT tracking

论文&#xff1a;《Learning reliable modal weight with transformer for robust RGBT tracking》 针对问题&#xff1a;局部线性匹配容易丢失语义信息 解决方法&#xff1a;为了增强特征表示和深化语义特征&#xff0c;分别设计了一种基于改进的Resnet-50的模态权值分配策略…

MATLAB中Filter Designer的使用以及XILINX Coefficient(.coe)File的导出

文章目录 Filter Designer的打开滤波器参数设置生成matlab代码生成XILINX Coefficient(.COE) File实际浮点数的导出官方使用教程 Filter Designer的打开 打开Filter Designer&#xff1a; 方法一&#xff1a;命令行中输入Filter Designer&#xff0c;再回车打开。 方法二&…

漏洞-任意账号注册

一漏洞介绍 1.未验证邮箱/手机号 情景&#xff1a;应用为了方便用户记录用户名&#xff0c;使用邮箱和手机号作为用户名&#xff08;因此很多应用在注册的时候就要求用户填写&#xff0c;多数时候都会给用户发送激活信息&#xff0c;激活后才能登录&#xff09; 缺陷&#xff…