今天我写了一个小谓词来查找容器中的匹配符号。
但我遇到了一个问题:我希望在类的const方法内的std::find_if
调用中使用此谓词,在一个容器中搜索该类的成员。
但我发现std::find
和std::find_if
都无法在const_iterators
上运作!
我检查了一些C ++引用,似乎没有std::find
或std::find_if
的版本接受/返回const_iterators
。我只是无法理解为什么,因为从我所看到的,这些算法无法修改迭代器引用的对象。
以下是SGI实施中记录std::find
的方式:
返回第一个迭代器i 范围[first,last]使得* i == 值。如果没有,则返回最后 迭代器存在。
答案 0 :(得分:15)
std::find
和std::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::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;
}
这应该被任何正常运行的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()作为函数参数。