写在前面:感谢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,是因为它们的一下缺点:
它们只能处理那些只接受一个参数或者没有参数的成员函数,而mem_fn可以处理任意个参数的情况;
根据处理的是对象指针还是对象本身需要在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));
};
