![](/img/trans.png)
[英]Why is it not possible to remove elements from a std::map using reverse iterators?
[英]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.