GeekBand学习笔记-第七周 关于STL的使用之二

写在前面:感谢GeekBand提供这样好的学习机会,让我在繁忙的工作之余可以学习巩固c++知识。以下是边学边记的一些扩展点。分享给大家。

知识总结

泛型算法

非变易算法

特点:模板函数,不改变操作对象的前提下对元素进行处理。
例如:查找,子序列搜索,统计,匹配
具体包括

for_each             count
find                 count if
find_if              mismatch
adjacent_find        equal
find_first_of        search

变易算法

特点:模板函数,改变容器中对象的操作。
具体包括

copy            remove
swap            unique
transform       reserve
replace         rotate
fill            random_shuffle
generate        partition

排序

sort
template<class _RanIt> inline
void sort (_RanIt _First, _RanIt _Last)

对[_First, _Last) 中从小到大排序,对于被排序的元素,需要有operator<.

partial_sort

只对First到Mid段落从小到大排序,而Mid到Last不排序。简单理解成为:容器前几个元素在整个容器范围内查找并排序,剩下的就不管了。

template<class _RanIt> inline
void partial_sort(_RanIt _First, _RanIt _Mid, _RanIt _Last)
binary_sort

查找前,需要进行一次排序。否则会出现找不到的情况
在[_First, _Last) 中查找等于_Val的元素。

template<class _FwdIt, class _Ty> inline
void binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
merge
template<class _InIt1, class _InIt2, class _OutIt>inline
_OutIt merge(_InIt1 _First1, InIt1, _Last1,_InIt2 _First2, InIt2, _Last2, _OutIt _Dest )

将排好序的[_First1, _Last1)和 [_First2, _Last2)合并到_Dest里

集合算法

includes

判断[_First1, _Last1) 是否包含 [_First2, _Last2) ;
[_First1, _Last1) 和 [_First2, _Last2) 事先需要排好序

template<class _InIt1, class _InIt2> inline
bool includes(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2)

Set相关算法

set_union
set_intersection
set_difference

Heap相关算法

make_heap
push_heap
pop_heap
sort_heap

泛型数值算法<numeric>

accumulate
inner_product
partial_sum
adjacent_difference

话题 运行对象成员函数

mem_fun vs mem_fn

看看用法

    class T  
    {  
    public:  
        T() = default;  
        ~T() = default;  
                                     
        void doSomething()  
        {  
            cout << "do something" << endl;  
        }  
    };  
      
    vector<T> vecT;  
    vecT.emplace_back(1);  
    vecT.emplace_back(2);  
    std::for_each(vecT.begin(), vecT.end(), mem_fun_ref(&T::print));  
      
    vector<T*> vecT;  
    vecT.emplace_back(new T(1));  
    vecT.emplace_back(new T(2));  
    std::for_each(vecT.begin(), vecT.end(), mem_fun(&T::print));  

但是在C++ 11之后,mem_fun和mem_fun_ref已经被标记为deprecated,即将被废弃,取而代之的是使用mem_fn。之所以不再使用mem_fun和mem_fun_ref,是因为它们的一下缺点:

  1. 它们只能处理那些只接受一个参数或者没有参数的成员函数,而mem_fn可以处理任意个参数的情况;

  2. 根据处理的是对象指针还是对象本身需要在mem_fun和mem_fun_ref之间做选择,而mem_fn可以处理这两种情况;

mem_fn

这个方法来自于Boost库,然而这个功能不能通过GCC5.2的编译。如果想通过编译,还是需要用上面的两种方法。这里只是给大家展示一下mem_fn的便利。如果只是VS环境下的C++,是可以用的

std::for_each(v.begin(), v.end(), boost::mem_fn(&Shape::draw)); 
//这个在VS里(C++11的标准),boost可以写作std

顺便看一下用法

struct X
{
    void f();
};

void g(std::vector<X> & v)
{
    std::for_each(v.begin(), v.end(), boost::mem_fn(&X::f));
};

void h(std::vector<X *> const & v)
{
    std::for_each(v.begin(), v.end(), boost::mem_fn(&X::f));
};

void k(std::vector<boost::shared_ptr<X> > const & v)
{
    std::for_each(v.begin(), v.end(), boost::mem_fn(&X::f));
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容