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

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


  • 相关阅读:
    我的vim开发环境搭建:C/C++/Go,持续更新中
    MFC的组合框(ComboBox)控件切换下拉样式
    回顾下杂乱的10月
    C++将整型数据转换成大端或小端存储顺序
    C/C++动态分配连续空间,下标越界导致的free():invalid next size问题
    O(n)空间复杂度,打印杨辉三角形的前n行
    C指针笔试题,蛋疼的多重指针运算,谭浩强的阴影
    2017滴滴出行笔试题:异或和为0的最大区间个数
    manjaro安装
    关于top命令
  • 原文地址:https://www.cnblogs.com/james1207/p/3331443.html
Copyright © 2020-2023  润新知