STL find和find_if

一、find()算法

template<class InputIterator, class T>
  InputIterator find ( InputIterator first, InputIterator last, const T& value )
  {
    for ( ;first!=last; first++) if ( *first==value ) break;
    return first;
  }

返回区间[first,end)中第一个值等于value的元素的位置;如果没有找到匹配元素,则返回end。
复杂度:线性复杂度。最多比较次数是:元素的总个数。

程序实例:
下面的程序在int类型的vector中搜寻元素5和12,如果搜索到,就返回其位置,否则输出提示信息。

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    vector<int> intVec;

    INSERT_ELEMENTS(intVec,1,9);

    vector<int>::iterator pos;
    pos = find(intVec.begin(),intVec.end(),5);

    if(pos != intVec.end())
        cout << "The value 5 exists,and its position is " <<pos + 1 << endl;
    else
        cout << "The value 4 not found!" << endl;

    pos = find(intVec.begin(),intVec.end(),12);

    if(pos != intVec.end())
        cout << "The value 12 exists,and its position is " <<pos + 1 << endl;
    else
        cout << "The value 12 not found!" << endl;
}

二、find_if()算法

template <class InputIterator, class Predicate> 
InputIterator find_if(InputIterator first, InputIterator last,Predicate pred) 
{ 
       while (first != last && !pred(*first)) ++first; 
       return first; 
}

find_if是一个模板函数,接受两个数据类型:InputItearator迭代器,Predicate用于比较数值的函数或者函数对象(仿函数)。 find_if对迭代器要求很低,只需要它支持自增操作即可。当前遍历到的记录符合条件与否,判断标准就是使得pred()为真。

实例1:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
bool IsOdd (int i) {
 return ((i%2)==1);
}
 
int main () {
 vector<int> myvector;
 vector<int>::iterator it;
 
 myvector.push_back(10);
 myvector.push_back(25);
 myvector.push_back(40);
 myvector.push_back(55);
 
 it = find_if (myvector.begin(), myvector.end(), IsOdd);
 cout << "The first odd value is " << *it << endl;
 
 return 0;
}

实例2:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
class CTest
{
public:
 bool IsOdd (int i) {
  return ((i%2)==1);
 }
 
 int test () {
  vector<int> myvector;
  vector<int>::iterator it;
  myvector.push_back(10);
  myvector.push_back(25);
  myvector.push_back(40);
  myvector.push_back(55);
  it = find_if (myvector.begin(), myvector.end(), std::bind1st(std::mem_fun(&CTest::IsOdd),this));
  cout << "The first odd value is " << *it << endl;
  return 0;
 }
};
int main()
{
 CTest t1;
 t1.test();
 return 0;
}

运行结果:

The first odd value is 25:

实例3:

#include <vector>    
#include <string>    

struct value_t    {    
    int a;    
    int b;    
};    
 
class vector_finder{    
public:    
    vector_finder(const int a):m_i_a(a){}    
    bool operator ()(const std::vector<struct value_t>::value_type &value){    
       return value.a == m_i_a;    
    }    
private:    
    int m_i_a;                        
};    

int main(){    
    std::vector<struct value_t> my_vector;    
    struct value_t my_value;    
    my_value.a = 11; my_value.b = 1000;    
    my_vector.push_back(my_value);    
       
    my_value.a = 12; my_value.b = 1000;    
    my_vector.push_back(my_value);    
     
    my_value.a = 13; my_value.b = 1000;    
    my_vector.push_back(my_value);    
 
    my_value.a = 14; my_value.b = 1000;    
    my_vector.push_back(my_value);    
    
    std::vector<struct value_t>::iterator it = my_vector.end();    
    it = std::find_if(my_vector.begin(), my_vector.end(), vector_finder(13));    
    if (it == my_vector.end())    
        printf("not found\n");           
    else    
        printf("found value.a:%d value.b:%d\n", it->a, it->b);    
    getchar();    
    return 0;            
}
时间: 2024-10-24 04:05:33

STL find和find_if的相关文章

STL中的find_if函数【转载】

上一篇文章也讲过,find()函数只能处理简单类型的内容,也就是缺省类型,如果你想用一个自定义类型的数据作为查找依据则会出错!这里将讲述另外一个函数find_if()的用法 这是find()的一个更强大的版本.这个例子演示了find_if(),它接收一个函数对象的参数作为参数, 并使用它来做更复杂的评价对象是否和给出的查找条件相付.假设我们的list中有一些按年代排列的包含了事件和日期的记录.我们希望找出发生在1997年的事件. 代码如下: [c-sharp] view plaincopy //

STL list 使用find_if查找算法

set和multiset map和multimap 有成员函数find函数可快速查找 vector和list 没有find函数想要查找通过迭代器遍历 以下使用类重载运算符实现find_if快速查找: typedef struct strTmpLinkMan { CString TmpLinkManName; CString TmpLinkManeEmail; }strTmpLinkMan; typedef std::list<strTmpLinkMan> TmpLinkMan_t; typed

STL list链表的用法详解(转)

本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通函数,而且例子丰富,通俗易懂.不失为STL的入门文章,新手不容错过! 0 前言 1 定义一个list 2 使用list的成员函数push_back和push_front插入一个元素到list中 3 list的成员函数empty() 4 用for循环来处理list中的元素 5 用STL的通用算法for_each来处理list中的元素 6 用STL的通用算法count_if()来统计list中的元素个数 7 使用count_i

C++ list 类学习笔记(转载)

双向循环链表list list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素.在STL中,list和vector一样,是两个常被使用的容器.和vector不一样的是,list不支持对元素的任意存取.list中提供的成员函数与vector类似,不过list提供对表首元素的操作push_front.pop_front,这是vector不具备的.和vector另一点不同的是,list的迭代器不会存在失效的情况,他不像vector会保留备份空间,在超过容量额度时重新全部分配内存,导致迭代器

[转]C++ list 类学习笔记

双向循环链表list list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素.在STL中,list和vector一样,是两个常被使用的容器.和vector不一样的是,list不支持对元素的任意存取.list中提供的成员函数与vector类似,不过list提供对表首元素的操作push_front.pop_front,这是vector不具备的.和vector另一点不同的是,list的迭代器不会存在失效的情况,他不像vector会保留备份空间,在超过容量额度时重新全部分配内存,导致迭代器

C++ list类详解

转自:http://blog.csdn.net/whz_zb/article/details/6831817 双向循环链表list list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素.在STL中,list和vector一样,是两个常被使用的容器.和vector不一样的是,list不支持对元素的任意存取.list中提供的成员函数与vector类似,不过list提供对表首元素的操作push_front.pop_front,这是vector不具备的.和vector另一点不同的是,li

[ZZ] C++ list

双向循环链表list list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素.在STL中,list和vector一样,是两个常被使用的容器.和vector不一样的是,list不支持对元素的任意存取.list中提供的成员函数与vector类似,不过list提供对表首元素的操作push_front.pop_front,这是vector不具备的.和vector另一点不同的是,list的迭代器不会存在失效的情况,他不像vector会保留备份空间,在超过容量额度时重新全部分配内存,导致迭代器

c++中list的使用说明

因公司项目需要,用到list容器  学习笔记如下 1,Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许 快速 的插入和删除,但是随机访问却比较慢. List用法实例: 用的时候 #include <list>                                // 加入此头文件 //创建一个list容器的实例LISTINT typedef list<int> LISTINT;        //        顾名思义  容器存放int型的

Lambda 表达式的示例

本文中的过程演示如何使用 lambda 表达式. Lambda Expressions in C++.' data-guid="411656d77b666e51e15caac8de528191">有关 lambda 表达式的概述,请参见 C++ 中的 Lambda 表达式. Lambda Expression Syntax.' data-guid="df40a218a0617e5e01e20ad28527a334">有关 lambda 表达式结构的更多信