news 2026/4/2 13:31:48

一天认识一个STL库函数——size()

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一天认识一个STL库函数——size()

一、什么是size()函数?

在C++的STL(Standard Template Library)中,size()是一个极其常用的成员函数,用于返回容器中当前元素的数量。无论你使用的是vectorlistsetmap还是其他STL容器,size()都能帮你快速获取容器的大小。

二、基本用法

#include <iostream> #include <vector> #include <list> #include <set> using namespace std; int main() { // vector示例 vector<int> vec = {1, 2, 3, 4, 5}; cout << "Vector大小: " << vec.size() << endl; // 输出: 5 // list示例 list<std::string> lst = {"apple", "banana", "cherry"}; cout << "List大小: " << lst.size() << endl; // 输出: 3 // set示例 set<double> st = {1.1, 2.2, 3.3, 4.4}; cout << "Set大小: " << st.size() << endl; // 输出: 4 return 0; }

三、size()的特点

1.时间复杂度:O(1)

几乎所有STL容器的size()操作都能在常数时间内完成,这意味着容器会维护一个内部计数器来跟踪元素数量。

2.返回类型:size_t

size()返回的是size_t类型,这是一个无符号整数类型,足够大以表示任何可能容器的大小。

3.空容器的size()返回0

vector<int> emptyVec; cout << emptyVec.size(); // 输出: 0

四、实际应用场景

1.循环遍历

vector<int> numbers = {10, 20, 30, 40, 50}; // 传统的遍历方式 for (size_t i = 0; i < numbers.size(); ++i) { cout << numbers[i] << " "; } // 或者结合C++11的范围for循环 for (const auto& num : numbers) { cout << num << " "; }

2.检查容器是否为空

// 虽然可以使用empty(),但size() == 0也能达到相同效果 vector<int> data; if (data.size() == 0) { cout << "容器为空!" << endl; } // 更推荐使用empty(),因为语义更清晰 if (data.empty()) { cout << "容器为空!" << endl; }

3.容器操作前的检查

vector<int> scores = {85, 90, 78}; // 安全地访问元素 if (scores.size() > 2) { cout << "第三个分数是: " << scores[2] << endl; } // 安全地删除元素 if (!scores.empty()) { scores.pop_back(); // 删除最后一个元素 }

五、注意事项和常见陷阱

1.无符号整数的陷阱

vector<int> vec = {1, 2, 3}; // 这段代码可能导致无限循环! // 当i减到0后再减1,会变成最大的size_t值 for (size_t i = vec.size() - 1; i >= 0; --i) { // 无限循环! } // 正确的反向遍历方式 for (size_t i = vec.size(); i-- > 0; ) { cout << vec[i] << " "; }

2.size()与capacity()的区别

vector<int> vec; vec.reserve(100); // 预分配100个元素的空间 cout << "size: " << vec.size() << endl; // 输出: 0 cout << "capacity: " << vec.capacity() << endl; // 输出: 100 vec.push_back(1); vec.push_back(2); cout << "size: " << vec.size() << endl; // 输出: 2 cout << "capacity: " << vec.capacity() << endl; // 输出: 100

3.C++17中的size()改进

从C++17开始,除了容器的成员函数size(),还提供了非成员函数std::size()

#include <iterator> int arr[] = {1, 2, 3, 4, 5}; std::cout << "数组大小: " << std::size(arr) << std::endl; // 输出: 5 std::vector<int> vec = {1, 2, 3}; std::cout << "向量大小: " << std::size(vec) << std::endl; // 输出: 3

六、性能考虑

虽然size()是O(1)操作,但在某些情况下,重复调用size()可能不是最佳实践:

// 不佳的写法:每次循环都调用size() for (size_t i = 0; i < vec.size(); ++i) { // 如果vec在循环中被修改,这可能是必要的 } // 优化写法:缓存size()结果 size_t n = vec.size(); for (size_t i = 0; i < n; ++i) { // 但要注意:如果循环中修改了vec的大小,这可能导致错误 }

七、总结

size()是STL中最基础、最常用的函数之一,它的简单性掩盖了其重要性。掌握size()的正确使用不仅能让你的代码更安全(避免越界访问),还能提高代码的可读性。记住以下几点:

  1. size()返回容器当前元素数量,时间复杂度为O(1)

  2. 使用size_t类型接收返回值,注意无符号整数的特性

  3. 在C++17及以上,可以使用更通用的std::size()

  4. 区分size()capacity()的不同含义

  5. 在需要频繁检查容器大小时,考虑缓存结果以提高性能

八、今日题目

问题描述

编写一个程序,从标准输入读取一段英文文本(以EOF结束),统计每个字母(不区分大小写)出现的次数,并按照字母表顺序输出每个字母及其出现频率。

输入格式

一段英文文本,可能包含多行,以EOF结束。

输出格式

按照字母顺序,每行输出一个字母及其出现次数,格式为:
字母: 次数

如果某个字母没有出现,则不输出该字母。

输入:

Hello World! This is a test. Programming is fun!

输出:

a: 2 d: 1 e: 2 f: 1 g: 2 h: 2 i: 4 l: 3 m: 2 n: 2 o: 3 p: 1 r: 3 s: 5 t: 4 u: 1 w: 1

代码解答:

#include <iostream> #include <map> #include <cctype> // 用于isalpha()和tolower()函数 using namespace std; int main() { // 使用map存储字母及其频率,map会自动按键(字母)排序 map<char, int> letterCount; char ch; // 从标准输入读取字符直到EOF while (cin.get(ch)) { // 检查字符是否为字母 if (isalpha(static_cast<unsigned char>(ch))) { // 转换为小写字母 char lowerCase = tolower(static_cast<unsigned char>(ch)); // 在map中增加该字母的计数 letterCount[lowerCase]++; } } // 使用size()函数检查容器状态 if (letterCount.size() == 0) { cout << "没有找到任何字母!" << endl; } else { cout << "字母频率统计结果:" << endl; // 遍历map,自动按字母顺序输出 for (const auto& pair : letterCount) { cout << pair.first << ": " << pair.second << endl; } } return 0; }

昨天忘发了,今天补发一条.

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/29 2:45:53

智能Agent与Docker容器编排实战(高可用架构设计稀缺方案)

第一章&#xff1a;智能Agent的Docker容器编排策略在构建分布式智能Agent系统时&#xff0c;Docker容器化技术为环境一致性、快速部署与资源隔离提供了坚实基础。然而&#xff0c;随着Agent数量增长和交互复杂度上升&#xff0c;单一容器管理已无法满足需求&#xff0c;必须引入…

作者头像 李华
网站建设 2026/3/27 15:58:52

探索多路温度采集控制系统:从原理到实现

多路温度采集控制系统 本设计采用单片机作为数据处理与控制单元&#xff0c;为了进行数据处理&#xff0c;单片机控制数字温度传感器&#xff0c;把温度信号通过单总线从数字温度传感器传递到单片机上。 单片机数据处理之后&#xff0c;发出控制信息改变报警和控制执行模块的状…

作者头像 李华
网站建设 2026/3/29 15:38:53

Wan2.2-T2V-A14B在地震断层错动模拟中的地质力学还原

Wan2.2-T2V-A14B在地震断层错动模拟中的地质力学还原 想象一下&#xff0c;地质学家只需输入一段专业描述&#xff1a;“龙门山断裂带北段发生Mw 7.9级逆冲型地震&#xff0c;上盘抬升5米&#xff0c;破裂以3 km/s速度向北传播”&#xff0c;几秒钟后&#xff0c;一段写实风格…

作者头像 李华
网站建设 2026/3/24 20:52:28

先整个三相LC滤波的Simulink模型框架出来——三相全桥逆变器接LC滤波,后边挂个电网。重点在于怎么让并网电流波形干净,THD控制在5%以内

三相LC滤波无源逆变电路仿真 simulink仿真 开关控制调节负载大小&#xff0c;保证并网电流THD<5% 下图并网电流波形 运行性能好 THD<5% 具备很好的学习性和参考价值逆变桥用Universal Bridge模块&#xff0c;记得把二极管参数里的Ron改成0.001Ω&#xff0c;不然仿真结…

作者头像 李华
网站建设 2026/3/27 0:25:11

了解学习K8S-HPA水平扩缩容

一、 HPA解决的问题HPA全称是 Horizontal Pod Autoscaler&#xff0c;也就是对k8s的workload的副本数进行自动水平扩缩容(scale)机制&#xff0c;也是k8s里使用需求最广泛的一种Autoscaler机制&#xff0c;在开始详细介绍HPA之前&#xff0c;先简单梳理下k8s autoscale的整个大…

作者头像 李华