• 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种方式中,执行一次拷贝构造函数我可以理解,但是执行两次,就不理解了。

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


  • 相关阅读:
    【转载】时域信号的频谱、功率谱和功率谱密度计算
    【转载】Chaotic Time-Series Prediction
    【转载】Restarting an analysis in ANSYS
    Interpolation in MATLAB
    【转载】ANSYS 动力分析 (9)
    在oracle中 将一个以逗号隔开的String字符串转换成以单引号逗号隔开的集合
    在java中获取时间,单位毫秒。主要用于查看执行时间效率
    比较两个数组元素是否相等
    oracle 从一张表的数据复制到另一张表中 mapper.xml
    打印错误栈信息:可以捕获具体错误信息
  • 原文地址:https://www.cnblogs.com/james1207/p/3331443.html
Copyright © 2020-2023  润新知