C++ 标准库容器的常用成员函数

server/2025/3/4 1:09:01/

目录

C++ 标准库容器简介

通用成员函数

1. 大小相关

size()

empty()

max_size()

2. 元素访问

operator[]

at(size_t n)

front()

back()

3. 修改容器

push_back(const T& value)

pop_back()

clear()

insert()

erase()

4. 迭代器相关

begin()

end()

rbegin() 和 rend()

std::vector 的特有成员函数 

1. capacity()

2. reserve(size_t n)

3. resize(size_t n)

4. shrink_to_fit()(C++11 起)

其他容器的特有函数(简单介绍)

std::list:

std::map:

std::set:

C++ 标准库提供了多种容器(如 std::vector、std::list、std::map 等),这些容器都有一些通用的成员函数,也有一些特定于容器类型的函数。

C++ 标准库容器简介

C++ 标准库容器在 <vector>、<list>、<map> 等头文件中定义,属于 STL(标准模板库)的一部分。常见的容器包括:

  • 顺序容器:std::vector(动态数组)、std::array(固定数组)、std::list(双向链表)、std::deque(双端队列)。

  • 关联容器:std::map(键值对映射)、std::set(唯一键集合)。

  • 无序容器:std::unordered_map、std::unordered_set(哈希表实现)。

每个容器都有一套成员函数,用于操作容器中的元素、管理大小和访问数据。

通用成员函数

大多数容器都支持以下通用成员函数(部分可能因容器类型略有差异):

1. 大小相关

  • size()
    • 返回容器当前元素个数。

    • 返回类型:size_t(无符号整数)。

    • 示例:

std::vector<int> vec = {1, 2, 3};
std::cout << vec.size();  // 输出 3
empty()
  • 检查容器是否为空。

  • 返回类型:bool(true 表示空)。

  • 示例:

std::vector<int> vec;
std::cout << vec.empty();  // 输出 1 (true)
vec.push_back(1);
std::cout << vec.empty();  // 输出 0 (false)
max_size()
  • 返回容器理论上能容纳的最大元素个数(受内存限制)。

  • 返回类型:size_t。

  • 示例:

std::vector<int> vec;
std::cout << vec.max_size();  // 输出很大数字(如 2³²-1 或 2⁶⁴-1)

2. 元素访问

  • operator[]
    • 通过索引访问元素(不检查越界)。

    • 返回类型:元素类型的引用(T&)。

    • 只适用于支持随机访问的容器(如 vector, deque)。

    • 示例:

std::vector<int> vec = {10, 20, 30};
std::cout << vec[1];  // 输出 20
vec[1] = 50;          // 修改为 50
at(size_t n)
  • 通过索引访问元素(带越界检查,抛出 std::out_of_range 异常)。

  • 返回类型:元素类型的引用(T&)。

  • 示例:
std::vector<int> vec = {10, 20};
std::cout << vec.at(1);  // 输出 20
// vec.at(5);  // 抛出异常:out of range
front()
  • 返回第一个元素的引用。

  • 示例:

std::vector<int> vec = {1, 2, 3};
std::cout << vec.front();  // 输出 1
back()
  • 返回最后一个元素的引用。

  • 示例:

std::vector<int> vec = {1, 2, 3};
std::cout << vec.back();  // 输出 3

3. 修改容器

  • push_back(const T& value)
    • 在容器末尾添加一个元素(vector, list, deque 支持)。

    • 示例:

std::vector<int> vec;
vec.push_back(42);  // vec = {42}
pop_back()
  • 删除最后一个元素(不返回)。

  • 示例:

std::vector<int> vec = {1, 2, 3};
vec.pop_back();  // vec = {1, 2}
clear()
  • 删除所有元素,使容器变空。

  • 示例:

std::vector<int> vec = {1, 2, 3};
vec.clear();  // vec 变空,size() == 0
insert()
  • 在指定位置插入元素(具体参数因容器不同)。

  • 示例(vector):

std::vector<int> vec = {1, 3};
vec.insert(vec.begin() + 1, 2);  // vec = {1, 2, 3}
erase()
  • 删除指定位置或范围的元素。

  • 示例:

std::vector<int> vec = {1, 2, 3};
vec.erase(vec.begin());  // vec = {2, 3}

4. 迭代器相关

  • begin()
    • 返回指向第一个元素的迭代器。

    • 示例:

std::vector<int> vec = {1, 2, 3};
auto it = vec.begin();  // it 指向 1
end()
  • 返回指向末尾后一位置的迭代器(不指向最后一个元素)。

  • 示例:

std::vector<int> vec = {1, 2, 3};
auto it = vec.end();  // 指向 3 之后的“哨兵”位置
rbegin() 和 rend()
  • 返回反向迭代器(从末尾向开头遍历)。

  • 示例:

std::vector<int> vec = {1, 2, 3};
auto rit = vec.rbegin();  // 指向 3

std::vector 的特有成员函数 

1. capacity()
  • 返回当前分配的内存容量(可能大于 size())。

  • 示例:

std::vector<int> vec;
vec.push_back(1);
std::cout << vec.capacity();  // 可能输出 1、2、4(实现依赖)
2. reserve(size_t n)
  • 预分配内存空间,避免频繁扩展。

  • 示例:

std::vector<int> vec;
vec.reserve(10);  // 预留空间给 10 个元素
vec.push_back(1);  // 不会重新分配内存
3. resize(size_t n)
  • 调整容器大小,多余元素删除,缺少元素用默认值填充。

  • 示例:

std::vector<int> vec = {1, 2};
vec.resize(4);  // vec = {1, 2, 0, 0}
vec.resize(1);  // vec = {1}
4. shrink_to_fit()(C++11 起)
  • 缩小容量以匹配当前大小(非强制,可能无效)。

  • 示例:

std::vector<int> vec(100);  // 容量 >= 100
vec.resize(10);
vec.shrink_to_fit();  // 试图将容量缩小到 10

其他容器的特有函数(简单介绍)

  • std::list:
    • push_front():在头部添加元素。

    • pop_front():删除头部元素。

  • std::map:
    • find(key):查找键对应的元素。

    • insert({key, value}):插入键值对。

  • std::set:
    • count(value):检查值是否存在(返回 0 或 1)。


http://www.ppmy.cn/server/172210.html

相关文章

PHP函数与类:面向对象编程实践指南

PHP函数与类&#xff1a;面向对象编程实践指南 PHP的面向对象编程&#xff08;OOP&#xff09;能力使其成为构建可维护、可扩展Web应用的重要工具。本文从函数封装到类设计&#xff0c;系统讲解PHP面向对象编程的核心概念与实践技巧。 一、函数&#xff1a;代码复用的基本单元…

在 ASP.NET Core 中压缩并减少图像的文件大小

示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90294127 在当今的数字时代&#xff0c;图像是 Web 应用程序和用户体验不可或缺的一部分。但是&#xff0c;处理大型图像文件可能会导致网页加载缓慢和更高的存储费用。为了解决这个问题&#xff0c;在…

第十四届蓝桥杯:DFS之飞机降落

这道题&#xff0c;由于它的数据范围是非常小的&#xff0c;我们可以采取暴力搜索的措施&#xff0c;把每种情况都枚举出来&#xff0c;如果有能行的情况就返回true 同时我们也要学会剪枝&#xff0c;如果已经确认飞机不能降落&#xff0c;就不要往下再展开了 #include <i…

第十五站:循环神经网络(RNN)与长短期记忆网络(LSTM)

1. 循环神经网络&#xff08;RNN&#xff09;概述 RNN 是一种非常适合处理序列数据的神经网络。与传统的前馈神经网络不同&#xff0c;RNN 具有一个 循环连接&#xff0c;它可以 记住 前一个时刻的信息&#xff0c;并将其传递到当前时刻。 RNN 的工作原理&#xff1a; 输入序…

设计模式Python版 观察者模式

文章目录 前言一、观察者模式二、观察者模式示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对象之间的组…

TCP 三次握手与四次挥手

TCP 三次握手与四次挥手知识总结 一、TCP 连接与断开的核心机制 1. 三次握手&#xff08;建立连接&#xff09; 目的&#xff1a; 建立客户端与服务端之间的双向传输通道&#xff0c;确保双方都能确认对方的接收和发送能力&#xff0c;为后续的数据传输奠定可靠基础。 流程…

【AIGC系列】3:Stable Diffusion模型原理介绍

AIGC系列博文&#xff1a; 【AIGC系列】1&#xff1a;自编码器&#xff08;AutoEncoder, AE&#xff09; 【AIGC系列】2&#xff1a;DALLE 2模型介绍&#xff08;内含扩散模型介绍&#xff09; 【AIGC系列】3&#xff1a;Stable Diffusion模型原理介绍 【AIGC系列】4&#xff1…

【网络安全 | 渗透测试】GraphQL精讲二:发现API漏洞

未经许可,不得转载。 推荐阅读:【网络安全 | 渗透测试】GraphQL精讲一:基础知识 文章目录 GraphQL API 漏洞寻找 GraphQL 端点通用查询常见的端点名称请求方法初步测试利用未清理的参数发现模式信息使用 introspection探测 introspection运行完整的 introspection 查询可视化…