news 2026/6/10 18:35:10

一天认识一个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/6/10 11:16:29

iOS微信红包助手2025:智能自动抢红包完全指南

iOS微信红包助手2025&#xff1a;智能自动抢红包完全指南 【免费下载链接】WeChatRedEnvelopesHelper iOS版微信抢红包插件,支持后台抢红包 项目地址: https://gitcode.com/gh_mirrors/we/WeChatRedEnvelopesHelper 还在为错过微信红包而烦恼吗&#xff1f;2025年最先进…

作者头像 李华
网站建设 2026/6/9 19:52:07

市场运营年终PPT生成效率榜:AI工具真实体验排名

每到年终&#xff0c;市场运营的小伙伴们就忙得不可开交&#xff0c;尤其是制作年终总结PPT&#xff0c;简直是一场噩梦。要熬夜搜集资料、搭建框架&#xff0c;好不容易有了内容&#xff0c;又得为设计美观度发愁&#xff0c;而且不同软件之间还存在格式兼容问题&#xff0c;一…

作者头像 李华
网站建设 2026/6/10 11:16:29

Wan2.2-T2V-A14B如何生成带有文字标题的动态片头?

Wan2.2-T2V-A14B如何生成带有文字标题的动态片头&#xff1f; 在短视频日更、品牌内容全球分发的今天&#xff0c;一个高质量的动态片头早已不是影视工业的专属配置。无论是教育博主需要为每期节目定制“知识星球”开场动画&#xff0c;还是跨国企业要快速输出十种语言版本的品…

作者头像 李华
网站建设 2026/6/10 11:16:40

Universal x86 Tuning Utility:终极Intel CPU电压调节解决方案揭秘

Universal x86 Tuning Utility&#xff1a;终极Intel CPU电压调节解决方案揭秘 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuning-Utility …

作者头像 李华
网站建设 2026/6/10 12:55:08

Wan2.2-T2V-A14B在宠物行为教学视频中的拟人化表达

Wan2.2-T2V-A14B在宠物行为教学视频中的拟人化表达 你有没有想过&#xff0c;一只穿着围裙的小猫在厨房里煎蛋&#xff0c;还会一边翻锅一边说“别急&#xff0c;火候刚刚好”&#xff1f;这听起来像是动画片里的桥段&#xff0c;但如今借助AI&#xff0c;它已经可以被精准地生…

作者头像 李华