关闭

c++ find()

标签: c++find函数
179人阅读 评论(0) 收藏 举报
分类:
 STL的find,find_if函数提供了一种对数组、STL容器进行查找的方法。使用该函数,需 #include <algorithm>
我们查找一个list中的数据,通常用find(),例如:

using namespace std;
int main()
{
    list<int> lst;
    lst.push_back(10);
    lst.push_back(20);
    lst.push_back(30);
    list<int>::iterator it = find(lst.begin(), lst.end(), 10); // 查找list中是否有元素“10”
    if (it != lst.end()) // 找到了
    {
        // do something 
    }
    else // 没找到
    {
        // do something
    }
    return 0;
}

那么,如果容器里的元素是一个类呢?例如,有list<CPerson> ,其中CPerson类定义如下:

class CPerson
{
public:
    CPerson(void); 
    ~CPerson(void);

public:
    int age; // 年龄
};

那么如何用find()函数进行查找呢?这时,我们需要提供一个判断两个CPerson对象“相等”的定义,find()函数才能从一个list中找到与指定的CPerson“相等”的元素。
这个“相等”的定义,是通过重载“==”操作符实现的,我们在CPerson类中添加一个方法,定义为:
bool operator==(const CPerson &rhs) const;
实现为:
bool CPerson::operator==(const CPerson &rhs) const
{
    return (id == rhs.age);
}

然后我们就可以这样查找(假设list中已经有了若干CPerson对象)了:
list<CPerson> lst;
//////////////////////////////////
// 向lst中添加元素,此处省略
//////////////////////////////////
CPerson cp_to_find; // 要查找的对象
cp_to_find.age = 50;
list<CPerson>::iterator it = find(list.begin(), list.end(), cp_to_find); // 查找

if (it != lst.end()) // 找到了
{
    // do something 
}
else // 没找到
{
    // do something
}
这样就实现了需求。

有人说,如果我有自己定义的“相等”呢?例如,有一个list<CPerson*>,这个list中的每一个元素都是一个对象的指针,我们要在这个list中查找具有指定age的元素,找到的话就得到对象的指针。
这时候,你不再能像上面的例子那样做,我们需要用到find_if函数,并自己指定predicate function(即find_if函数的第三个参数,请查阅STL手册)。先看看find_if函数的定义:
template<class InputIterator, class Predicate>
InputIterator find_if(InputIterator _First, InputIterator _Last, Predicate _Pred);
Parameters
_First
An input iterator addressing the position of the first element in the range to be searched.
_Last
    An input iterator addressing the position one past the final element in the range to be searched.
_Pred
    User-defined predicate function object that defines the condition to be satisfied by the element being searched for. A predicate takes single argument and returns true or false.


我们在CPerson类外部定义这样一个结构体:
typedef struct finder_t
{
    finder_t(int n) : age(n) { } bool operator()(CPerson *p) { return (age == p->age); } int age;
}finder_t;

然后就可以利用find_if函数来查找了:
list<CPerson*> lst;
//////////////////////////////////
// 向lst中添加元素,此处省略
//////////////////////////////////

list<CPerson*>::iterator it = find_if(lst.begin(), lst.end(), finder_t(50)); // 查找年龄为50的人
if (it != lst.end()) // 找到了
{
    cout << "Found person with age : " << (*it)->age;
}
else // 没找到
{
    // do something
0
0
查看评论

C++中find()函数的使用方法

转载自:http://blog.csdn.net/youxin2012/article/details/9162415 string中 find()的应用  (rfind() 类似,只是从反向查找) 原型如下: (1)size_t find (const string&...
  • flyyufenfei
  • flyyufenfei
  • 2017-03-23 10:37
  • 2753

C++中find函数用法

C++中STL里提供了许多字符串操作的函数,下面是字符串查找方面的部分函数用法简介: 1.find() 查找第一次出现的目标字符串: #include #include using namespace std; int main(){ string s1 = "abc...
  • laobai1015
  • laobai1015
  • 2017-03-16 16:40
  • 6527

泛型算法find和find_if以及sort

一般的查找方法是写个函数遍历这个vector,一个个进行比较查找。 实际上在使用STL的时候,不建议使用循环遍历的查找方法,建议使用stl的泛型算法。理由如下:(参考《effictive c++》46条) 效率:泛型算法通常比循环高效。 正确性: 写循环时比调用泛型算法更容易产生错误。 可维护性: ...
  • jiayichendddd
  • jiayichendddd
  • 2015-01-08 22:39
  • 1390

实战c++中的vector系列--vector应用之STL的find、find_if、find_end、find_first_of、find_if_not(C++11)

使用vector容器,即避免不了进行查找,所以今天就罗列一些stl的find算法应用于vector中。find() Returns an iterator to the first element in the range [first,last) that compares equal to v...
  • wangshubo1989
  • wangshubo1989
  • 2015-12-22 23:33
  • 6207

C++ map struct find

参考:http://stackoverflow.com/questions/9647110/using-struct-as-key-and-value-for-map-find-operation-giving-error  【参考2 Answers】 示例: struct IPPOI...
  • tt200911113009
  • tt200911113009
  • 2015-01-27 20:33
  • 378

C++ STL set::find的用法

上次面阿里巴巴。面试官问了我这样一个问题,“C++ STL中的set是如何实现的”。当时只答了二叉树,回来查下书,原来一般是红黑树,后悔没好好记住啊。。。 接着,面试官又考了我一道这样的编程题:定义一个Student结构体,包括name和age等数据,要求编程实习在set中查找一个name == ...
  • lishenglong666
  • lishenglong666
  • 2015-03-11 09:33
  • 934

c++ string find() 返回值

网上找了半天也没找到谁写的彻底一点,还不如自己动手。#include using namespace std; int main() { string s; while(cin >> s) { int f = s.find("o&q...
  • whiteParachute
  • whiteParachute
  • 2016-11-21 13:14
  • 1502

c++string.find()函数用法整理

发现find函数有很多用法,容易混淆,于是整理一下方便以后查看 #include #include using namespace std; void main() { ////find函数返回类型 size_type string s("1a2b3c4d5e6f7g8h9i1a2...
  • u011613729
  • u011613729
  • 2014-04-12 17:10
  • 5145

C++ vector 自定义类,重载==操作符,使用STL的find查找

#include #include #include #include using namespace std; class onec { private: int i; char c; double d; QString str; public: ...
  • syrchina
  • syrchina
  • 2016-02-18 14:09
  • 2870

C++函数CString::find

C++ STL里提供了很多字符串操作的函数,下面的字符串查找方面的部分函数用法简介。 1、find() 查找第一次出现的目标字符串: /* * Author:  mybestwishes * Created Time:  2011/4/9 15:...
  • changbaolong
  • changbaolong
  • 2013-09-10 21:41
  • 3362
    个人资料
    • 访问:211317次
    • 积分:3553
    • 等级:
    • 排名:第11017名
    • 原创:95篇
    • 转载:193篇
    • 译文:0篇
    • 评论:22条
    博客专栏
    最新评论