繁体   English   中英

将 std::find() 与反向迭代器一起使用

[英]Using std::find() With Reverse Iterators

我在理解如何在std::find()函数中使用反向迭代器时遇到了一些麻烦。 我相信如果我能看到一个完成以下任务的例子,我就能完美地理解它。

所以,假设我有一个想要搜索的std::vector 但是,我不想搜索典型的方式。 我想找到从某个索引开始并朝向向量开头的值的第一次出现。 为了显示:

3 | 4 | 7| 4| 2| 6| 3|
    ^             ^
    |<------------| 
             start_point

搜索:在给定上述搜索布局的情况下,查找第一次出现,共 4 个

预期结果:指数 3

我很确定在这种情况下必须使用反向迭代器,但我不知道该怎么做。

如果您使用的是std::vector或任何其他提供随机访问迭代器的容器,您可以只使用算术来推进迭代器,就像使用指针一样。 您的示例向量有 7 个元素,并且您希望从索引 5 开始,因此您可以使用以下命令获得该元素的普通迭代器:

auto i = v.begin() + 5;

对于反向迭代器,您从向量的后面开始,而不是从前面开始,因此要获得正确的偏移量,您必须从大小中减去所需的索引,如下所示:

auto i = v.rbegin() + (v.size() - 5);

在您的示例中,这将是2 ,因此反向迭代器将开始指向最后一个元素,然后向开头移动两个空格,到达您想要的起点。

然后,您可以以正常方式使用std::find

auto found = std::find(v.rbegin() + (v.size() - 5), v.rend(), 4);
if(found == v.rend()) {
    std::cout << "No element found." << std::endl;
} else {
    std::cout << "Index " << (v.rend() - found) << std::endl;
}

请记住,在测试std::find的结果以查看是否找到任何内容时,您需要使用rend() ,而不是end() 当您将反向迭代器与普通迭代器进行比较时,您是在比较实际位置,而不是从开始的偏移量,因此v.rend() != v.end()

如果您没有随机访问迭代器(例如,在std::list ),则不能使用指针式算术,因此您可以使用std::advance将迭代器std::advance到特定位置和std::distance获取两个迭代器之间的距离。

首先设置起始位置:

auto it = v.rbegin() + 2;  // two from the end

然后搜索:

auto kt = std::find(it, v.rend(), 4);

如果kt == v.rend() ,则找不到元素; 否则我们可以通过简单的距离计算从前面计算索引:

if (kt == v.rend()) {
  std::cerr << "Element 4 not found.\n";
  std::abort();
} else {
  auto n = std::distance(kt, v.rend()) - 1;
  std::cout << "Element 4 found at position v[" << n << "].\n";
}

尝试类似以下内容

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{
    std::vector<int> v = { 3, 4, 7, 4, 2, 6, 3 };
    std::vector<int>::size_type pos = 4;

    auto it = std::find(std::next(v.rbegin(), v.size() - pos), v.rend(), 4);

    if (it != v.rend())
    {
        std::cout << std::distance(v.begin(), it.base() - 1) << std::endl;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM