C++ 数组库函数
引言
在C++编程中,数组是最基本的数据结构之一,用于存储相同类型的元素集合。虽然C++继承了C语言中的原始数组,但现代C++提供了更安全、更强大的数组处理方式,特别是通过标准库中的各种函数和容器。本文将详细介绍C++中处理数组的库函数,包括std::array
容器和标准算法库中对数组的操作。
基本概念
在深入了解数组库函数之前,我们需要区分两种类型的数组:
- C风格数组:传统的、固定大小的数组
- std::array:C++11引入的数组容器类
// 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容器的便利性。
基本用法
#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 的常用成员函数
- at(n): 访问索引为n的元素,带边界检查
- operator[]: 访问索引指定的元素,不进行边界检查
- front(): 返回第一个元素的引用
- back(): 返回最后一个元素的引用
- data(): 返回指向底层数组的指针
- size(): 返回数组中的元素数量
- empty(): 检查数组是否为空
- fill(): 用特定值填充数组
- swap(): 交换两个数组的内容
示例代码:
#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. 排序与搜索
#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. 查找元素
#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