跳到主要内容

C++ 数组库函数

引言

在C++编程中,数组是最基本的数据结构之一,用于存储相同类型的元素集合。虽然C++继承了C语言中的原始数组,但现代C++提供了更安全、更强大的数组处理方式,特别是通过标准库中的各种函数和容器。本文将详细介绍C++中处理数组的库函数,包括std::array容器和标准算法库中对数组的操作。

基本概念

在深入了解数组库函数之前,我们需要区分两种类型的数组:

  1. C风格数组:传统的、固定大小的数组
  2. std::array:C++11引入的数组容器类
cpp
// C风格数组
int traditional[5] = {1, 2, 3, 4, 5};

// std::array
#include <array>
std::array<int, 5> modern = {1, 2, 3, 4, 5};

std::array 容器

介绍

std::array是C++11引入的一个封装固定大小数组的容器。它结合了C风格数组的性能和STL容器的便利性。

基本用法

cpp
#include <iostream>
#include <array>

int main() {
// 声明和初始化
std::array<int, 5> arr = {1, 2, 3, 4, 5};

// 访问元素
std::cout << "第三个元素: " << arr[2] << std::endl;
std::cout << "使用at()访问: " << arr.at(2) << std::endl;

// 获取大小
std::cout << "数组大小: " << arr.size() << std::endl;

return 0;
}

输出结果:

第三个元素: 3
使用at()访问: 3
数组大小: 5

std::array 的常用成员函数

  1. at(n): 访问索引为n的元素,带边界检查
  2. operator[]: 访问索引指定的元素,不进行边界检查
  3. front(): 返回第一个元素的引用
  4. back(): 返回最后一个元素的引用
  5. data(): 返回指向底层数组的指针
  6. size(): 返回数组中的元素数量
  7. empty(): 检查数组是否为空
  8. fill(): 用特定值填充数组
  9. swap(): 交换两个数组的内容

示例代码:

cpp
#include <iostream>
#include <array>

int main() {
std::array<int, 5> arr1 = {1, 2, 3, 4, 5};
std::array<int, 5> arr2 = {10, 20, 30, 40, 50};

// 使用front()和back()
std::cout << "第一个元素: " << arr1.front() << std::endl;
std::cout << "最后一个元素: " << arr1.back() << std::endl;

// 使用fill()
arr1.fill(7);
std::cout << "填充后的数组: ";
for (int i : arr1) {
std::cout << i << " ";
}
std::cout << std::endl;

// 使用swap()
arr1.swap(arr2);
std::cout << "交换后的arr1: ";
for (int i : arr1) {
std::cout << i << " ";
}
std::cout << std::endl;

return 0;
}

输出结果:

第一个元素: 1
最后一个元素: 5
填充后的数组: 7 7 7 7 7
交换后的arr1: 10 20 30 40 50
提示

与向量(std::vector)不同,std::array的大小是在编译时确定的,不能在运行时更改。这使得std::array更安全且性能更好。

算法库函数与数组

C++标准库提供了丰富的算法,可以应用于各种容器,包括数组。这些算法位于<algorithm>头文件中。

常用的算法函数

1. 排序与搜索

cpp
#include <iostream>
#include <array>
#include <algorithm>

int main() {
std::array<int, 5> arr = {3, 1, 4, 2, 5};

// 排序
std::sort(arr.begin(), arr.end());
std::cout << "排序后: ";
for (int i : arr) {
std::cout << i << " ";
}
std::cout << std::endl;

// 二分搜索(数组必须已排序)
bool found = std::binary_search(arr.begin(), arr.end(), 3);
std::cout << "是否找到3: " << (found ? "是" : "否") << std::endl;

return 0;
}

输出结果:

排序后: 1 2 3 4 5 
是否找到3: 是

2. 查找元素

cpp
#include <iostream>
#include <array>
#include <algorithm>

int main() {
std::array<int, 5> arr = {10, 20, 30, 40, 50};

// 查找特定值
auto it = std::find(arr.begin(), arr.end(), 30);
if (it != arr.end()) {
std::cout << "找到元素30,位置: " << std::distance(arr.begin(), it) << std::endl;
} else {
std::cout << "未找到元素" << std::endl;
}

// 查找满足条件的元素
auto it2 = std::find_if(arr.begin(), arr.end(), [](int x) { return x > 25; });
if (it2 != arr.end()) {
std::cout << "找到第一个大于25的元素: " << *it2 << std::endl;
}

return 0;
}

输出结果:

找到元素30,位置: 2
找到第一个大于25的元素: 30

3. 统计和累加

cpp
#include <iostream>
#include <array>
#include <algorithm>
#include <numeric>

int main() {
std::array<int, 5> arr = {10, 20, 30, 20, 50};

// 计数特定值出现的次数
int count = std::count(arr.begin(), arr.end(), 20);
std::cout << "20出现的次数: " << count << std::endl;

// 累加数组元素
int sum = std::accumulate(arr.begin(), arr.end(), 0);
std::cout << "所有元素之和: " << sum << std::endl;

return 0;
}

输出结果:

20出现的次数: 2
所有元素之和: 130

4. 改变数组内容

cpp
#include <iostream>
#include <array>
#include <algorithm>

int main() {
std::array<int, 5> arr = {1, 2, 3, 4, 5};

// 将每个元素乘以2
std::transform(arr.begin(), arr.end(), arr.begin(), [](int x) { return x * 2; });
std::cout << "每个元素乘以2后: ";
for (int i : arr) {
std::cout << i << " ";
}
std::cout << std::endl;

// 替换特定值
std::replace(arr.begin(), arr.end(), 6, 60);
std::cout << "替换6为60后: ";
for (int i : arr) {
std::cout << i << " ";
}
std::cout << std::endl;

return 0;
}

输出结果:

每个元素乘以2后: 2 4 6 8 10 
替换6为60后: 2 4 60 8 10

实际应用案例

案例1: 学生成绩管理系统

cpp
#include <iostream>
#include <array>
#include <algorithm>
#include <string>

struct Student {
std::string name;
int score;
};

int main() {
// 创建学生数组
std::array<Student, 5> students = {{
{"张三", 85},
{"李四", 92},
{"王五", 78},
{"赵六", 95},
{"钱七", 88}
}};

// 按成绩排序
std::sort(students.begin(), students.end(),
[](const Student& a, const Student& b) { return a.score > b.score; });

// 输出排名
std::cout << "学生成绩排名:" << std::endl;
for (size_t i = 0; i < students.size(); ++i) {
std::cout << i+1 << ". " << students[i].name << " - " << students[i].score << "分" << std::endl;
}

// 计算平均分
int totalScore = 0;
for (const auto& student : students) {
totalScore += student.score;
}
double average = static_cast<double>(totalScore) / students.size();
std::cout << "\n平均分: " << average << std::endl;

// 查找及格(60分以上)的学生数量
int passCount = std::count_if(students.begin(), students.end(),
[](const Student& s) { return s.score >= 60; });
std::cout << "及格学生人数: " << passCount << std::endl;

return 0;
}

输出结果:

学生成绩排名:
1. 赵六 - 95分
2. 李四 - 92分
3. 钱七 - 88分
4. 张三 - 85分
5. 王五 - 78分

平均分: 87.6
及格学生人数: 5

案例2: 简单的数据分析工具

cpp
#include <iostream>
#include <array>
#include <algorithm>
#include <numeric>
#include <cmath>

int main() {
// 输入一组数据
std::array<double, 10> data = {12.5, 10.0, 13.2, 15.7, 9.8, 11.2, 14.3, 10.5, 12.0, 11.5};

// 数据排序
std::sort(data.begin(), data.end());
std::cout << "排序后的数据: ";
for (double val : data) {
std::cout << val << " ";
}
std::cout << std::endl;

// 计算统计指标
double sum = std::accumulate(data.begin(), data.end(), 0.0);
double mean = sum / data.size();

// 计算中位数
double median;
if (data.size() % 2 == 0) {
median = (data[data.size()/2 - 1] + data[data.size()/2]) / 2;
} else {
median = data[data.size()/2];
}

// 计算标准差
double sq_sum = std::inner_product(data.begin(), data.end(), data.begin(), 0.0);
double stdev = std::sqrt(sq_sum / data.size() - mean * mean);

std::cout << "最小值: " << data.front() << std::endl;
std::cout << "最大值: " << data.back() << std::endl;
std::cout << "均值: " << mean << std::endl;
std::cout << "中位数: " << median << std::endl;
std::cout << "标准差: " << stdev << std::endl;

return 0;
}

输出结果:

排序后的数据: 9.8 10 10.5 11.2 11.5 12 12.5 13.2 14.3 15.7 
最小值: 9.8
最大值: 15.7
均值: 12.07
中位数: 11.75
标准差: 1.7979

总结

C++数组库函数为开发者提供了丰富的工具来操作和管理数组数据。通过使用std::array和算法库函数,我们可以:

  1. 安全地访问和操作数组元素
  2. 执行复杂的数据操作,如排序、搜索和转换
  3. 高效地实现各种数据处理任务
  4. 编写更简洁、更可维护的代码

这些功能使得现代C++中的数组处理既强大又灵活,能够适应各种编程需求。掌握这些库函数,将极大地提高您的C++编程效率和代码质量。

练习

  1. 创建一个包含10个整数的std::array,并实现一个函数来计算数组元素的平均值。
  2. 编写一个程序,使用std::array存储一周的温度数据,并找出最高温度、最低温度和平均温度。
  3. 实现一个简单的单词计数器,使用std::array<std::string>存储一组单词,然后统计每个单词出现的频率。
  4. 使用std::transform将一个整数数组中的所有元素转换为它们的平方值。
  5. 编写一个程序,使用std::partition将数组分为偶数部分和奇数部分。
备注

数组库函数是C++标准库的重要组成部分,持续学习和实践这些函数将帮助你成为更高效的C++程序员。

扩展阅读

掌握这些库函数将为您的C++编程之旅提供坚实的基础,并帮助您编写更高效、更可靠的代码。