STL容器和算法

agluo 发布于 2024-11-23 5 次阅读


AI 摘要

STL(标准模板库)是C++的核心组件之一,提供了多种高效的数据结构和算法。本文将深入探讨STL中的关键容器和算法,包括vector、set、string、map、queue、priority_queue、stack、pair,以及algorithm库。通过这些工具,开发者可以轻松实现动态数组、自动排序的集合、键值对存储、先进先出和后进先出的数据结构等功能,极大地简化了编程任务,提高了代码的可读性和效率。

简介

STL(Standard Template Library)是C++标准库的一部分,提供了丰富的数据结构和算法。

1.vector

vector是一种动态数组,可以自动调整其大小。

在图论中的应用:

  • vector可以用作邻接表来存储图。

定义:

std::vector<类型名> 变量名;
  • 类型名可以是基本类型(如intchar),也可以是自定义类型(如struct)。
  • 定义二维vectorstd::vector<std::vector<int>> name; std::vector<int> array[SIZE];
    • 前者一维和二维的长度都可以动态增加。
    • 后者只有二维的长度可以增加。

访问方式:

  • 下标访问ve[i]
  • 迭代器访问std::vector<类型名>::iterator it = v.begin(); for (int i = 0; i < v.size(); i++) { std::cout << it[i] << " "; }
    • 更常见的用法:for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) { std::cout << *it << " "; }

常用函数:

  • push_back():向vector末尾插入元素。
  • pop_back():从vector末尾弹出元素。
  • size():返回vector中元素的数量,时间复杂度为O(1)。
  • clear():清空vector
  • insert():在指定位置插入元素,insert(pos, x)
  • erase():删除指定位置或区间的元素,erase(pos)

为什么使用vector

  • 在处理一组长度未知的数据时,vector可以动态调整大小,减少空间占用。

2.set

set是一个内部自动有序且不含重复元素的容器。

定义:

std::set<类型名> 变量名;

元素访问:

  • set只能通过迭代器访问。std::set<类型名>::iterator it; for (std::set<int>::iterator it = st.begin(); it != st.end(); ++it) { std::cout << *it << " "; }

常用函数:

  • insert():插入元素。
  • find():查找元素,返回该值在容器内的迭代器。
  • erase():删除单个元素或一个区间的所有元素。
    • 删除单个元素:st.erase(it);
    • 删除一个区间:st.erase(it, st.end());
    • 删除指定值的元素:st.erase(st.find(value));
  • size():返回set中元素的数量。

为什么使用set

  • 当需要对一组数据进行去重并排序时,set是一个非常有用的数据结构。

3.string

string是一个字符串类,提供了丰富的字符串操作方法。

定义:

std::string 变量名;

常用函数:

  • append():追加字符串。
  • substr():获取子字符串。
  • length() 或 size():返回字符串的长度。
  • empty():检查字符串是否为空。
  • erase():删除指定位置或区间的字符。
  • find():查找子字符串的位置。
  • replace():替换指定位置的子字符串。

为什么使用string

  • 提供了丰富的字符串操作方法,方便处理文本数据。

4.map

map是一个关联容器,存储键值对,并按键自动排序。

定义:

std::map<键类型, 值类型> 变量名;

元素访问:

  • 通过键访问值:int value = m[key];
  • 使用迭代器访问:for (std::map<int, int>::iterator it = m.begin(); it != m.end(); ++it) { std::cout << it->first << " " << it->second << std::endl; }

常用函数:

  • insert():插入键值对。
  • find():查找键,返回迭代器。
  • erase():删除单个键值对或一个区间的所有键值对。
  • size():返回map中元素的数量。

为什么使用map

  • 当需要存储键值对并按键自动排序时,map是一个非常有用的数据结构。

5.queue

queue是一个先进先出(FIFO)的容器适配器。

定义:

std::queue<类型名> 变量名;

常用函数:

  • push():将元素推入队列。
  • pop():移除队列的第一个元素。
  • front():返回队列的第一个元素。
  • back():返回队列的最后一个元素。
  • empty():检查队列是否为空。
  • size():返回队列中元素的数量。

为什么使用queue

  • 当需要实现先进先出的数据结构时,queue是一个理想的选择。

6.priority_queue

priority_queue是一个优先队列,元素按照优先级顺序排列。

定义:

std::priority_queue<类型名> 变量名;

常用函数:

  • push():将元素推入优先队列。
  • pop():移除优先队列的第一个元素。
  • top():返回优先队列的第一个元素。
  • empty():检查优先队列是否为空。
  • size():返回优先队列中元素的数量。

为什么使用priority_queue

  • 当需要按优先级处理元素时,priority_queue是一个非常有用的数据结构。

7.stack

stack是一个后进先出(LIFO)的容器适配器。

定义:

std::stack<类型名> 变量名;

常用函数:

  • push():将元素推入栈。
  • pop():移除栈顶元素。
  • top():返回栈顶元素。
  • empty():检查栈是否为空。
  • size():返回栈中元素的数量。

为什么使用stack

  • 当需要实现后进先出的数据结构时,stack是一个理想的选择。

8.pair

pair是一个包含两个元素的简单结构体。

定义:

std::pair<类型1, 类型2> 变量名;

常用操作:

  • 访问元素:pair<int, int> p = {1, 2}; int first = p.first; int second = p.second;

为什么使用pair

  • 当需要存储两个相关联的元素时,pair是一个简洁而有效的方式。

9.algorithm

algorithm库提供了一系列通用算法,用于处理各种容器。

常用算法:

  • sort():对容器进行排序。
  • reverse():反转容器中的元素。
  • find():查找特定元素。
  • count():计算特定元素的数量。
  • max_element() 和 min_element():找到最大和最小元素。
  • accumulate():累加元素。

为什么使用algorithm

  • 提供了丰富的通用算法,简化了常见的编程任务。