New*_*biZ 4 c++ iterator stl const find
今天我写了一个小谓词来查找容器中的匹配符号.
但是我遇到了一个问题:我想在std::find_if一个类的const方法中调用这个谓词,在一个容器中搜索这个类的成员.
但我只是注意到既std::find不能std::find_if也不能操作const_iterators!
我检查了一些C++引用,似乎没有std::find或std::find_if接受/返回的版本const_iterators.我只是无法理解为什么,因为从我所看到的,这些算法无法修改迭代器引用的对象.
以下是std::findSGI实现中记录的内容:
返回[first,last]范围内的第一个迭代器i,使得*i == value.如果不存在这样的迭代器,则返回last.
Pav*_*aev 15
std::find并且std::find_if绝对可以对*::const_iterator给定的容器进行操作.您是否偶然看到这些功能的签名,并误解它们?
template <class InputIterator, class Type>
InputIterator find(InputIterator first, InputIterator last, const Type& val);
Run Code Online (Sandbox Code Playgroud)
请注意,InputIterator这里只是模板类型参数的名称,任何const_iterator都将满足它的要求.
或者,您可能会const_iterator使用迭代const器(即本身的迭代器)来混淆(即引用const值的迭代器const)?
std::find并且std::find_if都将迭代器类型作为模板参数,因此它们肯定可以操作const_iterators.只是为了一个简单的例子:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> x;
std::fill_n(std::back_inserter(x), 20, 2);
x.push_back(3);
std::vector<int>::const_iterator b = x.begin();
std::vector<int>::const_iterator e = x.end();
std::vector<int>::const_iterator p = std::find(b, e, 3);
std::cout << *p << " found at position: " << std::distance(b, p) << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这应该由任何正常运行的C++编译器接受,并产生如下结果:
3发现在位置:20