C++ <array> begin / end 函数
begin 和 end 是 array 中最重要的迭代器函数,用于获取容器的起始和结束迭代器。
begin 和 end 是容器类的成员函数:
begin返回指向容器第一个元素的迭代器end返回指向容器最后一个元素之后位置的迭代器(哨兵迭代器)
这两个函数是 C++ 标准库算法和范围 for 循环的基础。
单词释义: begin 表示"开始",end 表示"结束"。
基本语法与参数
begin 和 end 是容器类的成员函数,调用它们不需要参数。
语法格式
iterator begin() noexcept; const_iterator begin() const noexcept; iterator end() noexcept; const_iterator end() const noexcept;
参数说明
- 参数: 无参数
- 这些函数不接受任何参数。
函数说明
- 返回值:
begin()返回指向第一个元素的迭代器。end()返回指向最后一个元素之后位置的迭代器(哨兵)。
- 效果: 返回的迭代器可以用于遍历容器或与算法配合使用。
- 注意:
end()返回的迭代器指向的是一个"虚拟"位置,不能解引用,只能用于比较。
实例
让我们通过一系列例子,彻底掌握 begin 和 end 的用法。
示例 1:基础用法 - 遍历容器
实例
#include <iostream>
#include <array>
int main() {
std::array<int, 5> numbers = {10, 20, 30, 40, 50};
// 使用迭代器遍历
std::cout << "使用迭代器遍历: ";
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
#include <array>
int main() {
std::array<int, 5> numbers = {10, 20, 30, 40, 50};
// 使用迭代器遍历
std::cout << "使用迭代器遍历: ";
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
运行结果预期:
使用迭代器遍历: 10 20 30 40 50
代码解析:
numbers.begin()返回指向第一个元素(10)的迭代器。numbers.end()返回指向最后一个元素之后位置的迭代器。- 循环条件
it != numbers.end()确保遍历所有元素。
示例 2:范围 for 循环
C++11 引入的范围 for 循环底层就使用了 begin 和 end。
实例
#include <iostream>
#include <array>
#include <string>
int main() {
std::array<std::string, 3> names = {"Alice", "Bob", "Charlie"};
// 范围 for 循环(底层使用 begin/end)
std::cout << "使用范围 for 循环: ";
for(const auto& name : names) {
std::cout << name << " ";
}
std::cout << std::endl;
return 0;
}
#include <array>
#include <string>
int main() {
std::array<std::string, 3> names = {"Alice", "Bob", "Charlie"};
// 范围 for 循环(底层使用 begin/end)
std::cout << "使用范围 for 循环: ";
for(const auto& name : names) {
std::cout << name << " ";
}
std::cout << std::endl;
return 0;
}
运行结果预期:
使用范围 for 循环: Alice Bob Charlie
代码解析:
- 范围 for 循环是使用迭代器的简洁写法。
- 编译器会自动调用
begin()和end()。
示例 3:使用 STL 算法
标准库算法需要使用迭代器来指定范围。
实例
#include <iostream>
#include <array>
#include <algorithm>
int main() {
std::array<int, 6> numbers = {5, 2, 8, 1, 9, 3};
// 排序
std::sort(numbers.begin(), numbers.end());
std::cout << "排序后: ";
for(int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
// 查找元素
auto it = std::find(numbers.begin(), numbers.end(), 8);
if(it != numbers.end()) {
std::cout << "找到元素: " << *it << std::endl;
}
return 0;
}
#include <array>
#include <algorithm>
int main() {
std::array<int, 6> numbers = {5, 2, 8, 1, 9, 3};
// 排序
std::sort(numbers.begin(), numbers.end());
std::cout << "排序后: ";
for(int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
// 查找元素
auto it = std::find(numbers.begin(), numbers.end(), 8);
if(it != numbers.end()) {
std::cout << "找到元素: " << *it << std::endl;
}
return 0;
}
运行结果预期:
排序后: 1 2 3 5 8 9 找到元素: 8
代码解析:
std::sort(begin, end)使用迭代器指定排序范围。std::find(begin, end, value)使用迭代器指定搜索范围。
示例 4:反向迭代器
使用 rbegin 和 rend 可以反向遍历容器。
实例
#include <iostream>
#include <array>
int main() {
std::array<int, 5> numbers = {1, 2, 3, 4, 5};
// 正向遍历
std::cout << "正向: ";
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 反向遍历(使用 rbegin/rend)
std::cout << "反向: ";
for(auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
#include <array>
int main() {
std::array<int, 5> numbers = {1, 2, 3, 4, 5};
// 正向遍历
std::cout << "正向: ";
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 反向遍历(使用 rbegin/rend)
std::cout << "反向: ";
for(auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
运行结果预期:
正向: 1 2 3 4 5 反向: 5 4 3 2 1
代码解析:
rbegin()返回反向迭代器,指向最后一个元素。rend()返回反向迭代器,指向第一个元素之前。
示例 5:迭代器算术运算
迭代器支持算术运算,可以快速跳转到指定位置。
实例
#include <iostream>
#include <array>
int main() {
std::array<int, 7> numbers = {10, 20, 30, 40, 50, 60, 70};
// 获取第三个元素(索引 2)
auto it = numbers.begin() + 2;
std::cout << "begin() + 2 = " << *it << std::endl;
// 计算两个迭代器之间的距离
auto first = numbers.begin();
auto last = numbers.end();
auto distance = last - first;
std::cout << "容器大小(距离): " << distance << std::endl;
// 获取中间元素
auto mid = numbers.begin() + (numbers.size() / 2);
std::cout << "中间元素: " << *mid << std::endl;
return 0;
}
#include <array>
int main() {
std::array<int, 7> numbers = {10, 20, 30, 40, 50, 60, 70};
// 获取第三个元素(索引 2)
auto it = numbers.begin() + 2;
std::cout << "begin() + 2 = " << *it << std::endl;
// 计算两个迭代器之间的距离
auto first = numbers.begin();
auto last = numbers.end();
auto distance = last - first;
std::cout << "容器大小(距离): " << distance << std::endl;
// 获取中间元素
auto mid = numbers.begin() + (numbers.size() / 2);
std::cout << "中间元素: " << *mid << std::endl;
return 0;
}
运行结果预期:
begin() + 2 = 30 容器大小(距离): 7 中间元素: 40
代码解析:
- 迭代器支持
+、-等算术运算。 - 可以使用
end() - begin()计算容器大小。
示例 6:使用迭代器修改元素
迭代器返回的是引用,可以用来修改元素。
实例
#include <iostream>
#include <array>
int main() {
std::array<int, 5> numbers = {1, 2, 3, 4, 5};
std::cout << "修改前: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
// 使用迭代器将所有元素乘以 2
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
*it *= 2;
}
std::cout << "修改后: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
#include <array>
int main() {
std::array<int, 5> numbers = {1, 2, 3, 4, 5};
std::cout << "修改前: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
// 使用迭代器将所有元素乘以 2
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
*it *= 2;
}
std::cout << "修改后: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
运行结果预期:
修改前: 1 2 3 4 5 修改后: 2 4 6 8 10
代码解析:
- 迭代器解引用(
*it)返回的是元素的引用。 - 可以直接修改这个引用来改变元素的值。

C++ 容器类 <array>