代码改变世界

STL的std::find和std::find_if

2017-01-03 20:56  jiayayao  阅读(6902)  评论(0编辑  收藏

  std::find是用来查找容器元素算法,但是它只能查找容器元素为基本数据类型,如果想要查找类类型,应该使用find_if. STL算法的一个版本采用缺省的运算行为,该算法的另一个版本提供额外参数,接收外界传入的一个仿函数(functor),以便采用其他策略。可以采用其他策略的算法通常是以_if作为尾词,例如find_if(), replace_if().

  与此类似的,质变算法(改变操作区间内元素的值)分为in-place(就地计算)和copy(将对象内容拷贝一份副本,在副本上运算完毕后返回)版,copy版总是以_copy作为函数名称尾词

  小例子:

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <boost/format.hpp>  
#include <boost/cstdint.hpp>

using namespace std;
using namespace boost;


struct find_func{
    find_func(unsigned int var1)
        : var(var1) {
    }

    bool operator()(const std::map<boost::uint64_t,boost::uint64_t>::value_type &pair) {
        int var1 = pair.second;
        return (var == var1);
    }

    unsigned int var;
};

static std::map<boost::uint64_t,boost::uint64_t> test_map;

int main()
{
    std::cout<<"STD::FIND--------------------------------"<<std::endl;
    std::vector<int> v;
    for (int i = 0; i < 10; ++i)
        v.push_back(i);

    std::vector<int>::iterator iter = std::find(v.begin(), v.end(), 3);

    if (iter == v.end())
        std::cout << "Can not find value 3 in v" << std::endl;
    else
        std::cout << "The index of value " << (*iter) << " is " 
        << std::distance(v.begin(), iter) << std::endl;

    std::cout<<"STD::FIND_IF--------------------------------"<<std::endl;
    test_map[1000] = 1000;
    test_map[2000] = 2000;
    test_map[3000] = 3000;
    std::map<boost::uint64_t,boost::uint64_t>::iterator it = test_map.end();
    it = std::find_if(test_map.begin(), test_map.end(), find_func(2000));
    if (it == test_map.end()) {
        cout<<"Can not find the int variable"<<endl;
    } else {
        std::cout << "the index of value " << (*it).first << " is " 
        << std::distance(test_map.begin(), it) << std::endl;
    }

    return 0;
}
//Output:

STD::FIND---------------------------
The index of value 3 is 3
STD::FIND_IF------------------------
the index of value 2000 is 1