• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
james1207

博客园    首页    新随笔    联系   管理    订阅  订阅

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

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


 

 

posted @ 2013-09-21 13:18  Class Xman  阅读(1531)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3