使用一个东西,不明白它的道理,不高明
——侯捷老师
1. find()函数
在指定序列的范围内查找指定值
1.1 函数声明
template
InputIterator find(InputIterator first, InputIterator last, const T& val)
1.2 等价操作实现
template
InputIterator find(InputIterator first, InputIterator last, const T& val) {
while (first != last) {
if (*first == val) return first;
++first;
}
return last
}
1.3 参数详解
- first, last
输入迭代器,区间表示[first, last)
- val
查找的值
1.4 返回值
返回输入序列中第一个出现val的位置的迭代器,如果没有找到,则返回last
1.5 示例程式
test_find() {
// using find with array and pointer
int arr[] = {10, 20, 30, 40, 50};
int *p;
p = std::find(arr, arr+4, 30);
if (p != arr+4) {
cout << "Element found is arr: " << "*p = " << *p << endl;
} else {
cout << "Element not found in arr: " << "*p = " << *p << endl;
}
// using std::find with vector and iterator
vector vec(arr, arr+4);
vector::iterator it;
it = std::find(vec.begin(), vec.end(), 60);
if (it != vec.end()) {
cout << "Element found is arr: " << "*it = " << *it << endl;
} else {
cout << "Element not found" << "*it = " << *it << endl;
}
}
1.6 输出结果
1.7 参考链接
http://www.cplusplus.com/reference/algorithm/find/
2. find_end()函数
在序列1里查找序列2最后出现的位置的起点迭代器
2.1 函数声明
2.1.1 基于传统相等的比较
template
ForwardIterator1 find_end(ForwardIterator1 first, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2)
2.1.2 基于自定义谓词的比较
template
ForwardIterator1 find_end(ForwardIterator1 first, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2,
BinaryPredicate pred)
2.2. 等价操作实现
template
ForwardIterator1 find_end(ForwardIterator1 first, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2) {
if (first2 == last2) return first1;
ForwardIterator res = last1;
while (first1 != last1) {
ForwardIterator1 it1 = first1;
ForwardIterator2 it2 = first2;
while (*it1 == *it2) { // or while (pred(*it1, *it2)) for version 2
++it1;
++it2;
if (it2 == last2) {
res = first1;break;
}
if (it1 == last1) return res;
}
++first1;
}
return res;
}
2.3 参数详解
- first1, last1
输入序列迭代器,起止为止,区间表示为[first1, last1)
- first2, last2
同上
- pred
谓词,二元函数,可以是函数对象或者函数指针
2.4 返回值
en...有时候可能英文解释的更好懂~
An iterator to the first element of the last occurrence of [first2,last2) in [first1,last1).
If the sequence is not found, the function returns last1.
If [first2,last2) is an empty range, the function returns last1.
2.5 示例程式
bool myfunction(int i, int j) {
return (i == j);
}
void test_find_end() {
int myints[] = {1,2,3,4,5,1,2,3,4,5};
std::vector haystack (myints,myints+10);
int needle1[] = {1,2,3};
// using default comparison:
std::vector::iterator it;
it = std::find_end (haystack.begin(), haystack.end(), needle1, needle1+3);
if (it!=haystack.end())
std::cout << "needle1 last found at position " << (it-haystack.begin()) << '\n';
int needle2[] = {4,5,1};
// using predicate comparison:
it = std::find_end (haystack.begin(), haystack.end(), needle2, needle2+3, myfunction);
if (it!=haystack.end())
std::cout << "needle2 last found at position " << (it-haystack.begin()) << '\n';
}
2.6 输出结果
2.7 参考链接
http://www.cplusplus.com/reference/algorithm/find_end/
3. find_first_of()函数
功能:在源序列里查找第一个在目标序列里出现的位置
3.1 函数声明
3.1.1 基于传统相等的比较
template
InputIterator find_first_of(InputIterator first1, InputIterator last1,
ForwardIterator first2, ForwardIterator last2)
3.1.2 基于自定义谓词的比较
template
InputIterator find_first_of(InputIterator first1, InputIterator last1,
ForwardIterator first2, ForwardIterator last2,
BinaryPredicate pred)
3.2 等价操作实现
template
InputIterator find_first_of(InputIterator first1, InputIterator last1,
ForwardIterator first2, ForwardIterator last2) {
while (first1 != last1) {
for (ForwardIterator it = first2; it != last2; it++) {
if (*first1 == *it) return first1;
}
first1++;
}
return last1;
}
3.3 参数详解
参考3.2
3.4 返回值
返回[first1, last1)里第一个出现在[first2,last2)里元素的迭代器
3.5 示例程式
bool comp_case_insensitive(char c1, char c2) {
return (std::tolower(c1) == std::tolower(c2));
}
void test_find_first_of() {
int chars[] = {'a', 'b', 'c', 'A', 'B','C'};
vector charvec(chars, chars+6);
vector::iterator it;
char needle[] = {'A', 'B', 'C'};
// using default comparison
it = find_first_of(charvec.begin(), charvec.end(), needle, needle+3);
if (it != charvec.end()) {
cout << "The first match is: " << *it << endl;
}
//using predicate comparison
it = find_first_of(charvec.begin(), charvec.end(), needle, needle+3, comp_case_insensitive);
if (it != charvec.end()) {
cout << "The first match is: " << *it << endl;
}
}
3.6 输出结果
3.7 参考链接
http://www.cplusplus.com/reference/algorithm/find_first_of/
4. find_if()函数
功能:返回[first, last)里满足特定条件的第一个元素的迭代器
4.2 函数声明
template
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);
4.3 等价操作实现
template
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred) {
while (first != last) {
if (pred(*first)) return first;
}
return last;
}
4.4 参数详解
额...参考2.4
4.5 示例程式
bool IsOdd(int i) {
return (i % 2 == 1);
}
void test_find_if() {
std::vector myvector;
myvector.push_back(10);
myvector.push_back(25);
myvector.push_back(40);
myvector.push_back(55);
std::vector::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd);
std::cout << "The first odd value is " << *it << '\n';
}
4.6 输出结果

4.7 参考链接
http://www.cplusplus.com/reference/algorithm/find_if/
5. find_if_not()函数
功能:返回[first, last)里第一个不满足条件的元素的迭代器,与find_if()函数功能相反
5.1 函数声明
template
InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);
5.2 等价操作实现
template
InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred)
{
while (first!=last) {
if (!pred(*first)) return first;
++first;
}
return last;
}
5.3 参数详解
参考4.3
5.4 返回值
[first, last)里第一个不满足pred的元素的迭代器
5.5 示例程式
void test_find_if_not() {
std::array foo = {1,2,3,4,5};
std::array::iterator it =
std::find_if_not (foo.begin(), foo.end(), [](int i){return i%2;} );
std::cout << "The first even value is " << *it << '\n';
}
5.6 输出结果

5.7 参考链接
http://www.cplusplus.com/reference/algorithm/find_if_not/