我第一次使用std :: distance

问题描述

我有一个名为“ cache”的矢量变量(用于存储字符串,但我认为这不是必需的信息)。

我想找到向量'cache'中最后一次出现的变量'latest',当然是字符串。我使用std :: find。由于我想查找最后一次而不是第一次出现,因此我使用了反向迭代器,如下所示:

find(cache.rbegin(),cache.rend(),latest)

返回预期。现在,我想查找“缓存”的第一个元素与此返回的迭代器之间的距离(“缓存”中最后一次出现“最新”的点)。

所以我尝试:

distance(cache.begin(),find(cache.rbegin(),latest))

或更明显的是:

auto it = find(cache.rbegin(),latest)

distance(cache.begin(),it)

但是我得到“没有匹配功能调用'距离'。”

我知道这很简单,但是我已经搜索了大约一个小时,所以我来到了这里。任何信息,将不胜感激。不知道我在做什么错。

解决方法

您正在尝试计算反向迭代器与常规迭代器之间的距离。 std::distance的两个参数的类型必须相同。尝试以下方法:

size_t dist_from_begin =
    std::distance(find(cache.rbegin(),cache.rend(),latest),cache.rend());
,

现在,您正尝试使用一个正向迭代器和一个反向迭代器调用distance,但是它希望处理两个相同类型的迭代器。

要使其正常工作,您需要获取反向迭代器的“基础”,它将是到相同位置的正向迭代器。

auto it = find(cache.rbegin(),latest)

distance(cache.begin(),it.base());

您还可以使用:

distance(cache.rbegin(),it);

...但是这将为您提供从末端到找到的项的距离,而不是从起点到开始的距离,因此它将编译,但给出错误的答案。

,

您在这里混合使用不同的迭代器类型。 it是反向迭代器,而cache.begin()返回普通迭代器,distance不喜欢这样。