开始 () 和结束 () 有什么区别
What is the difference between begin () and rend ()?
我在迭代器中有一个关于begin()
和rend()
之间区别的问题。
#include <iostream>
#include <array>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v1;
v1 = {9,2,6,4,5};
cout<<*v1.begin();
cout<<*v1.rend();
return 0;
}
cout<<*v1.begin();
返回 9
但 cout<<*v1.rend();
返回一个不是 9 的数字
为什么会有如此不同的结果?
在C++中,范围由一对迭代器标记,标记范围的开始和超过范围结束的位置。对于容器,begin()
和 end()
成员函数为您提供了一对指向第一个和过去结束位置的迭代器。从end()
中读取是不安全的,因为它不指向实际的元素。
同样,rbegin()
和 rend()
成员函数返回反向迭代器,分别指向最后一个位置和第一个位置之前。出于同样的原因,取消引用end()
迭代器是不安全的(它已经过了范围的末尾(,你不应该取消引用rend()
迭代器,因为它不指向容器中的元素。
取消引用end()
或rend()
具有未定义的行为。
begin()
指向第一个元素,rbegin()
指向最后一个元素。 end()
(在大多数情况下(指向最后一个元素之后的一个元素,rend()
有效地指向第一个元素之前的一个元素(尽管它不是这样实现的(。
begin ()
和rend ()
有什么区别?
begin
将迭代器返回到容器的第一个元素。
rend
将反向迭代器返回到容器的第一个元素之前的 1(该元素比反向迭代器范围中的最后一个元素高出一个(。
*v1.rend()
通过rend
迭代器进行间接处理的行为是未定义的(通过迭代器进行间接end
也是如此(。
为什么会有如此不同的结果?
除了行为在一种情况下未定义而不是另一种情况下未定义之外,由于它们指的是不同的元素(其中一个元素是不存在的元素(,因此几乎没有理由假设结果是相同的。
vector::rend()
是C++标准库中的一个内置函数,它返回一个反向迭代器,指向数组容器中第一个元素之前的理论元素。 但vector::begin()
返回一个指向向量中第一个元素的迭代器。
请参阅此代码:
for (auto it = v1.rbegin(); it != v1.rend(); it++)
cout << *it << " ";
相反顺序的向量元素是:
5 4 6 2 9
要在向量中迭代,请始终同时选择以下方法之一:
-
vector::begin()
和vector::end()
-
vector::cbegin()
和vector::cend()
-
vector::crbegin()
和vector::crend()
-
vector::rbegin()
和vector::rend()
有关更多信息,请参阅 Ankit Lathiya 的"C++ Vector Tutorial with Example"。
在线试用
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?