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

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


  • 相关阅读:
    placeholder在ie浏览器里不显示的问题解决
    条件注释判断浏览器版本<!--[if lt IE 9]>
    在CSS中,BOX的Padding属性的数值赋予顺序为
    PhpStorm的注册码、Key
    关于【bootstrap modal 模态框弹出瞬间消失的问题】
    python 常见算法
    scrapy 爬虫基础
    python中的小知识点
    python 数据结构简介
    前端插件定制--表头和表内容
  • 原文地址:https://www.cnblogs.com/james1207/p/3331443.html
Copyright © 2011-2022 走看看