news 2025/12/14 7:45:40

一天认识一个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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/12 2:03:37

Wan2.2-T2V-A14B能否生成适用于VR心理暴露疗法的创伤情境

Wan2.2-T2V-A14B能否生成适用于VR心理暴露疗法的创伤情境 在一场深夜的心理咨询中&#xff0c;一位退伍军人低声描述着那段挥之不去的记忆&#xff1a;雨夜、泥泞的山路、突然响起的爆炸声。传统治疗依赖他“想象”那个场景&#xff0c;但语言的边界往往限制了情绪的真实唤醒—…

作者头像 李华
网站建设 2025/12/12 2:01:57

数据结构-栈(核心代码)

顺式结构#define _CRT_SECURE_NO_WARNINGS 1//栈的顺式结构#include<stdio.h> #define MAXSIZE 100 typedef int Elemtype; //定义栈 typedef struct stack {Elemtype data[MAXSIZE];int top; }Stack; //初始化栈 void initstack(Stack* S) {S->top -1; } //判断栈是…

作者头像 李华
网站建设 2025/12/12 1:56:38

哔哩下载姬:解锁B站视频离线收藏的终极方案

还在为无法随时随地观看B站精彩内容而苦恼吗&#xff1f;哔哩下载姬作为一款开源视频下载工具&#xff0c;能够轻松实现B站视频的离线收藏&#xff0c;支持从标清到8K超清的全画质下载&#xff0c;是每位B站深度用户的必备神器。 【免费下载链接】downkyi 哔哩下载姬downkyi&am…

作者头像 李华
网站建设 2025/12/12 1:56:19

关于电脑端抓包小程序的3种方法,黑客技术零基础入门到精通教程

声明&#xff1a;本号分享的安全工具、漏洞复现和项目均来源于网络&#xff0c;仅供安全研究与学习之用&#xff0c; 如用于其他用途&#xff0c;由使用者承担全部法律及连带责任&#xff0c;与工具作者和本号无关。关于电脑端对小程序进行安全测试抓包的一些方法和思路&#x…

作者头像 李华