使用带有反向迭代器的std :: find()
Using std::find() With Reverse Iterators
我很难了解如何使用std::find()
函数使用反向迭代器。我相信,如果我能看到一个完成以下任务的示例,我将能够完美理解。
所以,假设我有一个我想搜索的std::vector
;但是,我不想搜索典型的方式。我想找到一个从某个索引开始并朝向向量开始的值的首次出现。说明:
3 |4 |7 |4 |2 |6 |3 | ^ ^ |< ---------------- | 起点
搜索:给定上述搜索布局的首次出现,为4
预期结果:索引3
我很确定,在这种情况下,必须与反向迭代器一起工作,但我不知道该怎么做。
如果您使用的是std::vector
或提供随机访问迭代器的任何其他容器,则可以像使用指针一样使用算术来推进迭代器。您的示例向量有7个元素,您想从索引4开始,因此您可以将正常的迭代器与该元素相关联:
auto i = v.begin() + 4;
对于反向迭代器,您是从向量的背面而不是前后开始的,因此要获得右偏置,您必须从大小中减去所需的索引 1,例如:
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::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;
}
}
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 为什么在向量上使用 std::find() 时会出现错误?
- 使用 std::find 时没有匹配的函数调用错误
- STL std::find() C++
- 如何将 std::find() 与 2d std: 数组一起使用?
- 如果迭代器没有因插入而无效,则使用std::find和C::insert()是线程安全的
- 未按值排序的std::find和std::any_of
- 在libc++和libstdc++之间的std::map上使用std::find时的实现差异
- 有没有办法在Cython中导入std::find find_if等?
- 由 std::find() 返回的迭代器不可取消引用
- C++ std::find() 寻址返回向量的类函数时的意外行为
- 在 std::find 中使用来自不同命名空间的运算符
- 使用 std::find 和用户提供的谓词 - 自制的 find() 重载
- 如何使用 std::find 找到元素的所有位置?
- 使用带有反向迭代器的std :: find()
- C++ STL: std::find with std::map
- std::find是否隐式修复无效参数
- 如何在 std::vector 内的自定义对象上使用 std::find
- std::find on empty vector 是否会导致未定义的行为
- 使用 std::find 在向量中定位随机生成的数字