news 2026/1/9 8:01:44

一天认识一个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/1/4 7:58:03

腾讯用“LLM+GNN“双剑合璧,广告推荐GMV暴涨2.8%!小白也能学会的冷启动解决方案

摘要 传统的广告召回单一模型往往难以有效平衡“语义精准”与“关系覆盖”、“冷启动”与“实时性”之间的结构性矛盾。为应对这一挑战&#xff0c;腾讯广告技术团队提出了融合 LLM 与 GNN 的创新方案&#xff0c;采用“GNN挖掘关系、LLM解析语义”的协同机制。 该方案既保留了…

作者头像 李华
网站建设 2026/1/4 7:57:44

B站视频智能转文字工具:让视频内容轻松变文本

B站视频智能转文字工具&#xff1a;让视频内容轻松变文本 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为手动记录视频内容而烦恼吗&#xff1f;每天面…

作者头像 李华
网站建设 2026/1/6 22:57:11

Wan2.2-T2V-A14B已被纳入高校数字艺术课程教学案例库

Wan2.2-T2V-A14B已被纳入高校数字艺术课程教学案例库 在数字内容创作门槛不断降低的今天&#xff0c;一个学生只需输入“敦煌飞天在星空中起舞&#xff0c;衣袂飘飘如云卷云舒”&#xff0c;几秒钟后就能看到一段流畅、细腻、极具东方美学意境的视频片段——这不再是科幻场景&a…

作者头像 李华
网站建设 2026/1/4 20:25:29

GPT-5.2:人工智能的创造力,能否超越人类的想象力?

AI与人类创作的对比 随着GPT-5.2的发布&#xff0c;人工智能在创作领域的表现让人惊叹不已。从写作到设计&#xff0c;再到音乐和艺术创作&#xff0c;GPT-5.2的能力不断扩展&#xff0c;令人不禁思考&#xff1a;人工智能的创造力&#xff0c;真的能够超越人类的想象力吗&…

作者头像 李华
网站建设 2026/1/7 19:15:00

R语言量子计算模拟资源稀缺曝光:仅剩5个开源包可实战,别再错过

第一章&#xff1a;R语言量子计算模拟的现状与挑战随着量子计算研究的不断深入&#xff0c;传统编程语言在模拟量子系统中的作用日益凸显。R语言作为统计计算与数据可视化的主流工具&#xff0c;近年来也被尝试用于量子态模拟和基础量子算法实现。尽管其并非专为高性能数值计算…

作者头像 李华
网站建设 2026/1/8 18:21:51

cudaEventCreateWithFlags 的 cudaEventInterprocess 和 cudaEventDisableTiming

cudaEventCreateWithFlags(&localEvent, cudaEventInterprocess | cudaEventDisableTiming); 解释功能&#xff0c;特性功能解释cudaEventCreateWithFlags(&localEvent, cudaEventInterprocess | cudaEventDisableTiming) 创建一个特殊的 CUDA 事件&#xff0c;具有两个…

作者头像 李华