STL算法和const_iterators

时间:2009-10-27 17:53:31

标签: c++ stl iterator find const

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

但我遇到了一个问题:我希望在类的const方法内的std::find_if调用中使用此谓词,在一个容器中搜索该类的成员。

但我发现std::findstd::find_if都无法在const_iterators上运作!

我检查了一些C ++引用,似乎没有std::findstd::find_if的版本接受/返回const_iterators。我只是无法理解为什么,因为从我所看到的,这些算法无法修改迭代器引用的对象。

以下是SGI实施中记录std::find的方式:

  

返回第一个迭代器i   范围[first,last]使得* i ==   值。如果没有,则返回最后   迭代器存在。

5 个答案:

答案 0 :(得分:15)

对于给定的容器,

std::findstd::find_if肯定可以在*::const_iterator上运行。您是否偶然看到这些功能的签名,并误解了它们?

template <class InputIterator, class Type>
InputIterator find(InputIterator first, InputIterator last, const Type& val);

请注意,此处InputIterator只是模板类型参数的名称,任何const_iterator都将满足其要求。

或许,您可能会混淆const_iterator(即引用const值的迭代器)和const迭代器(即迭代器本身是const)?

答案 1 :(得分:5)

std::findstd::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;
}

这应该被任何正常运行的C ++编译器接受,并产生如下结果:

3发现位置:20

答案 2 :(得分:1)

我刚遇到同样的问题。我有一个在成员向量上调用find_if的成员函数,当我尝试创建成员函数const时,编译器给了我一个错误。事实证明,这是因为我将find_if的返回值分配给iterator而不是const_iterator。这导致编译器假设find_if的参数也必须是iterator而不是const_iterator,而const成员向量无法获取{{1}}。

答案 3 :(得分:1)

如果你出于同样的原因出现在我身边:

error: no matching function for call to ‘find(std::vector<int>::const_iterator, std::vector<int>::const_iterator, int)’

它与const_iterator没有任何关系。您可能只是忘了#include <algorithm>: - )

答案 4 :(得分:0)

我刚刚遇到此代码的问题:

std::string str;
std::string::const_iterator start = str.begin();
std::string::const_iterator match = std::find(start, str.end(), 'x');

错误是“std :: find没有匹配的重载”。

我需要的修复是使用cend()。令人困惑的是cbegin()不是必需的,我不确定为什么转换是可以的(隐式)而不是end()作为函数参数。