一、什么是size()函数?
在C++的STL(Standard Template Library)中,size()是一个极其常用的成员函数,用于返回容器中当前元素的数量。无论你使用的是vector、list、set、map还是其他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; // 输出: 1003.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()的正确使用不仅能让你的代码更安全(避免越界访问),还能提高代码的可读性。记住以下几点:
size()返回容器当前元素数量,时间复杂度为O(1)使用
size_t类型接收返回值,注意无符号整数的特性在C++17及以上,可以使用更通用的
std::size()区分
size()和capacity()的不同含义在需要频繁检查容器大小时,考虑缓存结果以提高性能
八、今日题目
问题描述
编写一个程序,从标准输入读取一段英文文本(以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; }昨天忘发了,今天补发一条.