STL 查找vector容器中的指定对象:find()与find_if()算法

1 从vector容器中查找指定对象:find()算法

   STL的通用算法find()和find_if()可以查找指定对象,参数1,即首iterator指着开始的位置,参数2,即次iterator指着停止处理的地方。注意:包含开始和结束的位置的元素。例子:

#include "stdafx.h"

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

int_tmain(int argc, _TCHAR* argv[])

{

    vector<char*> fruitVec;

    vector<char*>::iterator fruitIt;

    fruitVec.push_back("Apple");

    fruitVec.push_back("Pineapple");

    fruitVec.push_back("Star Apple");

    fruitIt= find(fruitVec.begin(),--(fruitVec.end()),"Star Apple");

    if(fruitIt == fruitVec.end())

    {

       cout<<"没找到"<<endl;

    }

    else

    {

       cout<<"找到了:"<<*fruitIt<<endl;

    }

    return 0;

}

执行结果:找到了:Star Apple

2 利用函数对象进行查找:find_if()

#include "stdafx.h"

#include <iostream>

#include <vector>

#include <algorithm>

#include <string>

using namespace std;

 

classIsTB

{

public:

    IsTB(char* pChar,int nLen)

    {

       cout<<"执行构造函数"<<endl;

       m_nLen= nLen;

       m_pChar= new char[m_nLen+1];

       strcpy(m_pChar,pChar);

    }

    IsTB(const IsTB& objTB) //需要定义拷贝构造函数

    {

       cout<<"执行拷贝构造函数"<<endl;

       m_nLen= objTB.m_nLen;

       m_pChar= new char[m_nLen+1];

       strcpy(m_pChar,objTB.m_pChar);

    }

    bool operator()(const char* pChar)

    {

       return (strcmp(pChar,m_pChar) == 0);

    }

    ~IsTB()

    {

       delete m_pChar;

       cout<<"执行析构函数"<<endl;

    }

public:

    char* m_pChar;

    int m_nLen;

};

 

int_tmain(int argc, _TCHAR* argv[])

{

    vector<char*> fruitVec;

    vector<char*>::iterator fruitIt;

    fruitVec.push_back("Apple");

    fruitVec.push_back("Pineapple");

    fruitVec.push_back("Red Apple");

    fruitVec.push_back("Star Apple");

   

    //IsTB objTB("Star Apple",10);//第中方式:先生成对象

    //fruitIt = find_if(fruitVec.begin(),fruitVec.end(),objTB);//第中方式,再使用对象

    fruitIt= find_if(fruitVec.begin(),fruitVec.end(),IsTB("StarApple",10)); //第一种方式:直接生成临时对象

    if(fruitIt == fruitVec.end())

    {

       cout<<"没找到"<<endl;

    }

    else

    {

       cout<<"找到了:"<<*fruitIt<<endl;

    }

 

    return 0;

}

第一种方式执行结果:

第2种方式的执行结果:

第2种方式中,执行一次拷贝构造函数我可以理解,但是执行两次,就不理解了。

有理解的麻烦告诉一声,非常感谢。


原文地址:https://www.cnblogs.com/james1207/p/3331443.html