C++前向迭代器算法
C++ forward iterator arithmetic
下面是一个简单的程序,用于打印小范围int的矢量内的位置。
int mynumbers [] = { 3, 9, 0, 2, 1, 4, 5 };
vector<int> v (mynumbers, mynumbers + 7);
int m1[] = {9, 0, 2 };
vector<int>::iterator it = find_end (v.begin(), v.end(), m1, m1+3);
if (it != v.end())
cout << "Found at position: " << it-v.begin() << endl;//LINE I
程序按预期打印
在位置发现:1
findend函数返回一个前向迭代器。从逻辑上讲,这样做对我来说毫无意义,但当我将"线路I"更改为时
cout << "Found at position: " << it+v.begin() << endl;//LINE I
我得到一个编译错误。我知道我应该使用"距离",但我只是想熟悉各种迭代器类型的局限性
感谢
it
是一个迭代器,它表示对象所在的位置。
关于it+v.begin()
,你说"从逻辑上讲,我这样做毫无意义…",这是对的,因为你添加了两个位置。当你把Californa的位置添加到纽约的位置时,你会得到什么?这个问题从字面上讲毫无意义。
但是,您可以计算两个位置之间的距离:it-v.begin()
。不确定你到底在问什么,但我希望能涵盖它。
简单的答案是为b - a
定义了一个操作,其中b
和a
属于相同的迭代器类型,但没有为b + a
定义任何操作。
来源:
非规范:cppreference,RandomAccess Iterator
规范性:N4140,[随机访问.迭代器]表111
你走在了正确的轨道上。
但我认为你在问题中提到的distance
是你的实际解决方案:http://www.cplusplus.com/reference/iterator/distance/
这就是您的情况:
begin()-->3它-->902.1.4.5.
distance(v.begin(), it)
将告诉您这两个指针相距多远。(在本例中为1)。
现在请记住,在引擎盖下,distance
只会做与本例相同的减法。
你应该这样想,v.begin()
是一个地址,it
也是。
v.begin()
为0x0100it
是0x0104
当你减去它们时,你会得到(0x0104 - 0x0100) / sizeof(int)
,所以你会得到1。
- 如何为指向复杂值的迭代器专门化算法?
- 为什么范围算法与 std 的迭代器不兼容?
- 当迭代器(输入参数)通常不是constexpr时,constexpr算法真的有用吗
- 在 stl 算法中移动迭代器
- 指针算法是否适用于迭代器?
- 用于双向迭代器的高德纳-莫里斯-普拉特算法
- 在目标函数中使用迭代器的 STL 算法
- stl风格的算法:如何管理输出迭代器
- 为什么C++ STL 中算法、迭代器和容器是分开的
- C++前向迭代器算法
- 具有四个迭代器的类似复制的算法
- C++算法在条件为真时推进迭代器
- 将我的自定义迭代器与 STL 算法一起使用
- 哪些 STL 算法可以安全地与单通道输入迭代器一起使用
- 在find_if算法中将 char* 转换为字符串::迭代器
- 从搜索算法返回的约定 - 索引或迭代器
- 常量迭代器与可变迭代器:相同的算法不同的代码
- 自定义迭代器和 STL 算法出错
- 为什么STL算法使用指针比std::向量迭代器快得多
- c++算法的迭代器类别要求