现在位置: 首页 > C++ 教程 > 正文

C++ <array> begin / end 函数

C++ 容器类 <array> C++ 容器类 <array>


beginend 是 array 中最重要的迭代器函数,用于获取容器的起始和结束迭代器

beginend 是容器类的成员函数:

  • begin 返回指向容器第一个元素的迭代器
  • end 返回指向容器最后一个元素之后位置的迭代器(哨兵迭代器)

这两个函数是 C++ 标准库算法和范围 for 循环的基础。

单词释义begin 表示"开始",end 表示"结束"。


基本语法与参数

beginend 是容器类的成员函数,调用它们不需要参数。

语法格式

iterator begin() noexcept;
const_iterator begin() const noexcept;

iterator end() noexcept;
const_iterator end() const noexcept;

参数说明

  • 参数: 无参数
    • 这些函数不接受任何参数。

函数说明

  • 返回值
    • begin() 返回指向第一个元素的迭代器。
    • end() 返回指向最后一个元素之后位置的迭代器(哨兵)。
  • 效果: 返回的迭代器可以用于遍历容器或与算法配合使用。
  • 注意end() 返回的迭代器指向的是一个"虚拟"位置,不能解引用,只能用于比较。

实例

让我们通过一系列例子,彻底掌握 beginend 的用法。

示例 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;
}

运行结果预期:

使用迭代器遍历: 10 20 30 40 50

代码解析:

  1. numbers.begin() 返回指向第一个元素(10)的迭代器。
  2. numbers.end() 返回指向最后一个元素之后位置的迭代器。
  3. 循环条件 it != numbers.end() 确保遍历所有元素。

示例 2:范围 for 循环

C++11 引入的范围 for 循环底层就使用了 beginend

实例

#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;
}

运行结果预期:

使用范围 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;
}

运行结果预期:

排序后: 1 2 3 5 8 9
找到元素: 8

代码解析:

  • std::sort(begin, end) 使用迭代器指定排序范围。
  • std::find(begin, end, value) 使用迭代器指定搜索范围。

示例 4:反向迭代器

使用 rbeginrend 可以反向遍历容器。

实例

#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;
}

运行结果预期:

正向: 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;
}

运行结果预期:

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;
}

运行结果预期:

修改前: 1 2 3 4 5
修改后: 2 4 6 8 10

代码解析:

  • 迭代器解引用(*it)返回的是元素的引用。
  • 可以直接修改这个引用来改变元素的值。

C++ 容器类 <array> C++ 容器类 <array>