C++前向迭代器算法

C++ forward iterator arithmetic

本文关键字:算法 迭代器 C++      更新时间:2023-10-16

下面是一个简单的程序,用于打印小范围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定义了一个操作,其中ba属于相同的迭代器类型,但没有为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()为0x0100
it是0x0104

当你减去它们时,你会得到(0x0104 - 0x0100) / sizeof(int),所以你会得到1。