STL算法和const_iterators

New*_*biZ 4 c++ iterator stl const find

今天我写了一个小谓词来查找容器中的匹配符号.

但是我遇到了一个问题:我想在std::find_if一个类的const方法中调用这个谓词,在一个容器中搜索这个类的成员.

但我只是注意到既std::find不能std::find_if也不能操作const_iterators!

我检查了一些C++引用,似乎没有std::findstd::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)?


Jer*_*fin 5

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