容器经过内存分配器分配空间;容器和算法由于迭代器而分离,算法经过迭代器访问容器;仿函数协助算法指定不一样的策略;适配器套接仿函数。仿函数将某种"行为"做为算法的参数传给算法。算法
给定一个vector,其元素为:[0,0,0,1,0],想要匹配到第一个非零元素。咱们有find_if()的算法和not_equal_to的函数对象,根据这两个东西就能够实现咱们的目的。然而,not_equal_to()(const T& a,const T&b),并不能接受一个参数;find_if()又是向最后一个函数对象直接给予一个引用做为参数,因此没法编译经过。为此使用binder1st来把其中的一个参数固定下来。函数
vector<int>::iterator it = find_if(v.begin(),v.end(),bind1st(not_equal_to<int>(),0));
Capacity是容器"占据"的空间,size是容器"使用"的空间。因此容器有可能占据了很大的空间然而并无使用那一部分空间,那么这种状况下应该经过swap方法对容器进行缩小。spa
1.拷贝的开销比较大。
2.若是存在继承,就会发生slicing。即因为保存的仅仅是基类对象,其留下的大小也就是基类对象的大小。若是存在继承关系时,若将派生类对象放入容器,则只会保留基类部分,派生类部分会丢失。这种方式体现出了C++中的多态性。指针
template<class _InIt,class _Fnl> inline _Fnl for_each(_InIt _First, _InIt _Last, _Fnl _Func)
for_each就是把两个迭代器之间的对象实例扔给_Func做为惟一参数。注意,_Func不必定非得是函数对象(仿函数),直接传函数名或函数指针也是能够的。code
template<class _InIt,class _Ty> inline _Ty find(_InIt _First, _InIt _Last,const _Ty& _Val)
若是在左闭右开区间内找到了值为_Val的对象则返回该迭代器,不然返回器尾部迭代器。对象
template<class _InIt,class _Pr> inline _Ty find(_InIt _First, _InIt _Last,const _Pr _Pred)
_Pr为一个函数名或者函数对象(仿函数)。若是在左闭右开区间内找到了的能使得这一对象返回真的,则返回该迭代器,不然返回器尾部迭代器。注意_Pr为单参,注意联合适配器的使用。继承
adjacent_findip
template <class ForwardIterator> ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last);
返回第一个遇到的两个连续相等的对象中,第一个对象的迭代器,如对于[0,1,2,3,3,4],则返回指向第一个3的迭代器。内存
template<class _InIt,class _Pr> inline _Ty find(_InIt _First, _InIt _Last,const _Pr _Pred)
Adjacent的操做其实是针对本身和后继进行的比较操做。除了默认的等于比较操做以外,也可使用自定义的函数或仿函数。_Pred 具备两个参数,使用时会把连续的两个值分别做为第一参数和第二参数求真值。ci
template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2); template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
它是在两组区间内搜索是否有it1==it2,若是有就返回第一组区间内对象的迭代器。也可使用自定义的双参函数进行比较。
template <class InputIterator, class T> typename iterator_traits<InputIterator>::difference_type count (InputIterator first, InputIterator last, const T& val);
返回左闭右开区间中值等于val的元素的个数。
类比find,count_if就是本身指定所想使用的函数。一样地,其为单参,要注意两对适配器的使用。
template <class InputIterator1, class InputIterator2, class BinaryPredicate> pair<InputIterator1, InputIterator2> mismatch (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred);
当不指定最后一个函数时,其做用是逐元素比对两个序列,返回指向第一个容器中的第一个不一致的迭代器。若是指定函数,则是须要返回值等于False。
template <class InputIterator1, class InputIterator2, class BinaryPredicate> bool equal (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred);
当不指定最后一个函数时,其做用是检查两个容器内容是否彻底相等。若指定最后一个函数,则是逐元素检查是否知足两两返回值均为True。
template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
当不指定最后一个函数时,其做用是搜索前一个序列中是否存在和第二个序列相同的子序列;若是自定义判别函数,则是逐元素比对,搜索是否存在可以和第二个序列匹配的序列。返回值为第一个序列中匹配的位置,若是找不到则返回末位迭代器。