[C++] C++中的begin和end

本文详细解读了C++容器中的begin和end函数,介绍了cbegin和cend的特性,以及rbegin和rend用于反向迭代。特别提到数组的begin和end与容器的不同。涵盖了常量和非常量版本的迭代器,以及它们在不同场景的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

容器:begin和end函数

begin和end是容器的两个成员函数

除了vector之外,标准库还定义了其他几种容器,所有标准库容器都可以使用迭代器

严格来说string类型不属于容器类型,但string支持很多与容器类似的操作

和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员

  • begin和end

    • begin:返回指向容器第一个元素的迭代器

    • end:返回指向容器最后一个元素下一个位置的迭代器

    begin和end返回的具体类型由对象是否是常量决定:

    • 如果对象是常量,begin和end返回const_iterator
    • 如果对象不是常量,返回iterator
    vector<int> v1;
    const vector<int> v2;
    auto itr1 = v1.begin();//itr1的类型是vector<int>::iterator,返回指向容器第一个元素的迭代器
    auto itr2 = v2.end();//itr2的类型是vector<int>::const_iterator,返回指向容器最后一个元素下一个位置的迭代器
    
  • cbegin和cend

    C++11新标准引入的两个新运算符

    • cbegin:返回指向容器第一个元素的迭代器
    • cend:返回指向容器最后一个元素下一个位置的迭代器

    重点是,不论vector对象(或者string对象)是否是常量,返回的都是const_iterator

    vector<int> v1;
    auto itr1 = v1.cbegin();//itr1的类型是vector<int>::const_iterator,返回指向容器第一个元素的迭代器
    
  • rbegin和rend

    带r的版本返回反向迭代器

    反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器

    • 递增一个迭代器(++it)会移动到前一个元素
    • 递减一个迭代器(–it)会移动到下一个元素

    除了forward_list之外,其他容器都支持反向迭代器,反向迭代器也有const和非const版本

    • crbegin:返回指向容器尾元素位置的const迭代器
    • crend:返回指向容器首元素之前一个位置的const迭代器
    • rbegin:返回指向容器尾元素位置的迭代器
    • rend:返回指向容器首元素之前一个位置的迭代器

数组:标准库函数begin和end

定义在iterator头文件中

数组不是类型,所以这两个begin和end不是成员函数.

  • begin:返回指向数组首元素的指针
  • end:返回指向数组尾元素下一个位置的指针
int a[] = {1, 2, 3, 4 ,5};//a是一个含有5个整型的数组
int *fir = begin(a);//指向a首元素的指针
int *las = end(a);//指向a尾元素下一个位置的指针

注意尾后指针不能执行解引用和递增操作

### C++ 中 `vector` 的 `begin()` `end()` 方法 #### 作用 在 C++ 中,`std::vector` 是一种动态数组容器,提供了随机访问的功能。`begin()` `end()` 是其成员函数,用于返回迭代器。 - **`begin()`**: 返回指向 `vector` 第一个元素的迭代器[^1]。 - **`end()`**: 返回指向 `vector` 超过最后一个元素位置的迭代器(即末尾之后的位置)。注意,这个位置并不对应任何实际存在的元素。 这两个方法通常被用来定义范围,在此范围内可以遍历整个 `vector` 容器中的所有元素。 #### 用法示例 以下是使用 `begin()` `end()` 遍历 `vector` 的代码示例: ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用 begin() end() for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; // 输出: 1 2 3 4 5 } return 0; } ``` 在这个例子中,通过调用 `vec.begin()` 获取到指向第一个元素的迭代器,而 `vec.end()` 则获取到最后一个元素后面的位置。循环条件判断当前迭代器是否等于 `end()` 来决定何时停止遍历。 另外需要注意的是,当处理反向遍历时会涉及到 `rbegin()` `rend()` 函数[^2]。它们分别提供从后向前的迭代方式。 #### 进一步解释 对于上述提到的方法: - 当前版本标准库支持基于范围的for语句可以直接操作容器无需显式写出迭代器变量声明部分简化书写形式如下所示: ```cpp #include <iostream> #include <vector> int main(){ std::vector<int> numbers{10, 20, 30}; // 基于范围的 for 循环 for(auto number : numbers){ std::cout<<number<<" "; } return 0; } // 输出结果为:10 20 30 ``` 尽管如此理解底层机制仍然重要因为某些情况下可能需要手动控制迭代过程或者应用更复杂的算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值