首页 > 编程语言 >标准库简介 - STL容器、算法简介

标准库简介 - STL容器、算法简介

时间:2025-01-04 11:32:35浏览次数:3  
标签:std 容器 STL 简介 int 算法 vec include

引言

C++ 标准模板库(Standard Template Library,简称 STL)是 C++ 标准库的一部分,提供了丰富的数据结构和算法。STL 的设计目标是通用性和高效性,它通过模板机制实现了高度的灵活性和复用性。本文将详细介绍 STL 中的容器和算法,并通过实例帮助读者理解其使用方法。

1. STL 容器简介

STL 容器是一组用于存储和管理数据的类模板。根据数据的组织方式,STL 容器可以分为以下几类:

1.1 序列容器

序列容器按照线性顺序存储元素,支持随机访问或顺序访问。常见的序列容器包括:

  • vector:动态数组,支持快速随机访问,但在中间插入或删除元素时效率较低。
  • list:双向链表,支持高效的插入和删除操作,但不支持随机访问。
  • deque:双端队列,支持在两端进行高效的插入和删除操作。
#include <iostream>
#include <vector>
#include <list>
#include <deque>

int main() {
    // 使用 vector
    std::vector<int> vec = {1, 2, 3};
    vec.push_back(4);
    for (int i : vec) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 使用 list
    std::list<int> lst = {1, 2, 3};
    lst.push_back(4);
    for (int i : lst) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 使用 deque
    std::deque<int> deq = {1, 2, 3};
    deq.push_back(4);
    deq.push_front(0);
    for (int i : deq) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

1.2 关联容器

关联容器根据键值对存储元素,并提供高效的查找、插入和删除操作。常见的关联容器包括:

  • set:存储唯一键值的有序集合。
  • multiset:允许存储重复键值的有序集合。
  • map:存储键值对的有序映射。
  • multimap:允许存储重复键值对的有序映射。
#include <iostream>
#include <set>
#include <map>

int main() {
    // 使用 set
    std::set<int> s = {3, 1, 2};
    for (int i : s) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 使用 map
    std::map<std::string, int> m = {{"apple", 1}, {"banana", 2}};
    m["orange"] = 3;
    for (const auto& pair : m) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}

1.3 无序关联容器

无序关联容器基于哈希表实现,提供平均常数时间复杂度的查找、插入和删除操作。常见的无序关联容器包括:

  • unordered_set:存储唯一键值的无序集合。
  • unordered_multiset:允许存储重复键值的无序集合。
  • unordered_map:存储键值对的无序映射。
  • unordered_multimap:允许存储重复键值对的无序映射。
#include <iostream>
#include <unordered_set>
#include <unordered_map>

int main() {
    // 使用 unordered_set
    std::unordered_set<int> us = {3, 1, 2};
    for (int i : us) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 使用 unordered_map
    std::unordered_map<std::string, int> um = {{"apple", 1}, {"banana", 2}};
    um["orange"] = 3;
    for (const auto& pair : um) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}

2. STL 算法简介

STL 提供了大量的泛型算法,这些算法可以应用于各种容器,而无需关心容器的具体实现细节。常见的 STL 算法包括:

2.1 查找算法

  • find:在范围内查找指定元素。
  • find_if:在范围内查找满足条件的元素。
  • count:统计范围内指定元素的数量。
  • count_if:统计范围内满足条件的元素数量。
#include <iostream>
#include <vector>
#include <algorithm>

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

    // 使用 find
    auto it = std::find(vec.begin(), vec.end(), 3);
    if (it != vec.end()) {
        std::cout << "找到元素 3" << std::endl;
    }

    // 使用 count
    int count = std::count(vec.begin(), vec.end(), 3);
    std::cout << "元素 3 出现了 " << count << " 次" << std::endl;

    return 0;
}

2.2 排序算法

  • sort:对范围内的元素进行排序。
  • stable_sort:保持相等元素相对顺序的排序。
  • partial_sort:对部分元素进行排序。
  • nth_element:将第 n 个元素放在正确的位置上。
#include <iostream>
#include <vector>
#include <algorithm>

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

    // 使用 sort
    std::sort(vec.begin(), vec.end());
    for (int i : vec) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

2.3 数值算法

  • accumulate:计算范围内元素的总和。
  • inner_product:计算两个范围的内积。
  • adjacent_difference:计算相邻元素的差值。
  • partial_sum:计算部分和。
#include <iostream>
#include <vector>
#include <numeric>

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

    // 使用 accumulate
    int sum = std::accumulate(vec.begin(), vec.end(), 0);
    std::cout << "总和: " << sum << std::endl;

    return 0;
}

2.4 修改算法

  • copy:将一个范围的元素复制到另一个范围。
  • replace:将范围内所有等于某个值的元素替换为另一个值。
  • reverse:反转范围内元素的顺序。
  • rotate:将范围内元素旋转。
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> vec2(vec.size());

    // 使用 copy
    std::copy(vec.begin(), vec.end(), vec2.begin());
    for (int i : vec2) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 使用 reverse
    std::reverse(vec.begin(), vec.end());
    for (int i : vec) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

3. 总结

STL 是 C++ 编程中不可或缺的一部分,它提供了丰富的容器和算法,极大地简化了编程任务。通过本文的介绍,相信读者已经对 STL 容器和算法有了较为全面的了解。如果你有任何问题或需要进一步的帮助,请随时留言讨论!

标签:std,容器,STL,简介,int,算法,vec,include
From: https://blog.csdn.net/2301_81482480/article/details/144926867

相关文章

  • 请使用js实现一个分组抽签的算法
    要实现一个分组抽签的算法,我们首先需要明确一些要求和步骤。以下是一个简单的实现,它允许你将一组人员随机分配到指定数量的组中:输入:参与抽签的人员列表。需要的组数。输出:每个组的人员列表。以下是一个简单的JavaScript实现:functionshuffleArray(array){for......
  • FJSP:部落竞争与成员合作算法(Competition of tribes and cooperation of members ,CTCM)
    一、柔性作业车间调度问题柔性作业车间调度问题(FlexibleJobShopSchedulingProblem,FJSP),是一种经典的组合优化问题。在FJSP问题中,有多个作业需要在多个机器上进行加工,每个作业由一系列工序组成,每个工序需要在特定的机器上完成。同时,每个机器一次只能处理一个工序,且每个工......
  • python和matlab水下目标图像增强算法(Retinex图像增强算法(SSR, MSR, MSRCR))
    水下图像颜色校正与增强使用Retinex方法水下图像常常因为能见度差和散射而退化,导致色彩丢失和光照减弱,特别是在红色通道。本项目复制了一种用于水下图像的颜色校正算法。该算法利用相机中的彩色滤波阵列(CFA)特性来增强色彩和光照,并采用Retinex模型改进光照效果以及自适应直......
  • 机器学习基础算法 (七)-朴素贝叶斯(Naive Bayes)
    介绍朴素贝叶斯(NaiveBayes)算法是一种基于贝叶斯定理的简单概率分类算法,通常用于文本分类、垃圾邮件过滤、情感分析等任务。尽管其“朴素”之名可能让人觉得它不够复杂,但实际应用中,朴素贝叶斯算法以其高效性和简单性,尤其适用于特征之间条件独立的假设下,表现出色。本文将......
  • 如何使用建筑物变化检测算法的Baseline工程 ,使用PyTorch框架,并选择U-Net来进行二分类
    建筑物变化检测算法baseline工程使用PyTorch框架,并选择U-Net来进行二分类任务(变化/不变)Baseline工程将基于深度学习方法来检测建筑物的变化备注:博客所有文章代码仅供参考!如何使用建筑物变化检测算法的Baseline工程,一个详细的步骤和代码示例。这个Baseline工程将基于深......
  • 算法解析-经典150(双指针、滑动窗口)
    文章目录双指针1.验证回文串1.答案2.思路2.判断子序列1.动态规划解法2.双指针3.两数之和II-输入有序数组1.答案2.思路4.盛最多水的容器1.答案2.思路5.三数之和1.答案2.思路滑动窗口1.长度最小的子数组1.答案2.思路2.无重复字符的最长子串1.答案2.思路3......
  • 算法解析-经典150(矩阵、哈希表)
    文章目录矩阵1.有效的数独1.答案2.思路2.螺旋矩阵1.答案2.思路3.旋转图像1.答案2.思路4.矩阵置零1.答案2.思路哈希表1.赎金信1.答案2.思路2.同构字符串1.答案2.思路3.单词规律1.答案2.思路4.有效的字母异位词1.答案2.思路5.字母异位词分组1.答案2.思路......
  • R机器学习:神经网络算法的理解与实操,实例解析
    神经网络算法是一种模仿生物神经网络(尤其是人脑)结构和功能的算法。它由大量相互连接的节点(称为神经元)组成,这些神经元组织成层,通过传递信号来处理信息。神经网络算法在机器学习、人工智能等领域中扮演着至关重要的角色,尤其擅长处理复杂的模式识别、分类和预测问题。今天给大家介绍......
  • BP神经网络的反向传播算法
    BP神经网络(BackpropagationNeuralNetwork)是一种常用的多层前馈神经网络,通过反向传播算法进行训练。反向传播算法的核心思想是通过计算损失函数对每个权重的偏导数,从而调整权重,使得网络的预测输出与真实输出之间的误差最小。下面是反向传播算法的公式推导过程:1.前向传播(Forw......
  • 通信工程专业课设[音响放大器设计与制作、电梯内部控制器的设计、基于单片机的GRPSGSM
    通信工程专业课设各种课设总览①模电级课程设计-音响放大器设计与制作②数电课程设计-电梯内部控制器的设计③单片机课设-基于单片机的GRPSGSM系统设计`&`基于单片机的433M无线通信系统④FPGA课设-异步fifo设计⑤Protel课程设计-基于单片机的温湿度控制系统⑥信息论课设-......