直接上源码:
template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value) {
while (first != last && *first != value) ++first;
return first;
}
template <class InputIterator, class Predicate>
InputIterator find_if(InputIterator first, InputIterator last,
Predicate pred) {
while (first != last && !pred(*first)) ++first;
return first;
}
find_if 需要自定义一个Predicate对象pred。要查找的值value保存在pred对象中,然后通过pred的仿函数进行比较操作。
通用的写法如下:
template <class T>
strcut find_t
{
find_t(T value) : v(value) {}
bool operator() (const T value) const { return value == v; }
T v;
}
对于map容器使用find
map的迭代器是用的rb_tree的迭代器
template <class Value, class Ref, class Ptr>
struct __rb_tree_iterator : public __rb_tree_base_iterator
{
typedef Value value_type;
typedef Ref reference;
typedef Ptr pointer;
typedef __rb_tree_iterator<Value, Value&, Value*> iterator;
typedef __rb_tree_iterator<Value, const Value&, const Value*> const_iterator;
typedef __rb_tree_iterator<Value, Ref, Ptr> self;
typedef __rb_tree_node<Value>* link_type;
__rb_tree_iterator() {}
__rb_tree_iterator(link_type x) { node = x; }
__rb_tree_iterator(const iterator& it) { node = it.node; }
reference operator*() const { return link_type(node)->value_field; }
#ifndef __SGI_STL_NO_ARROW_OPERATOR
pointer operator->() const { return &(operator*()); }
#endif /* __SGI_STL_NO_ARROW_OPERATOR */
self& operator++() { increment(); return *this; }
self operator++(int) {
self tmp = *this;
increment();
return tmp;
}
self& operator--() { decrement(); return *this; }
self operator--(int) {
self tmp = *this;
decrement();
return tmp;
}
};
reference operator*() const { return link_type(node)->value_field; }
typedef pair<const Key, T> value_type;
可以看出对map迭代器的operator *操作是取得这个迭代器的value_field。追踪代码可以知道,最终指向pair<const Key, T>类型。对pair类型的operator !=操作未定义。所以编译就不会通过。
所以find函数传入map的迭代器,结果未知。这样的用法从理论上也是不合适的。
map有自己的成员函数find。可以满足我们对map查找的绝大部分需求。