STL介绍:
我所理解的stl:
容器: 是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
算法: 是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
迭代器: 提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;
仿函数: 就是一个类里面重载() 所创建出来的对象,叫做函数对象,或者仿函数
迭代适配器(Adaptor):
空间配制器(allocator): 分配内存的, 偏底层
算法的使用介绍
在stl的算法中分为两大块:一个是全局(泛化)的,一个是容器本身所有的
在使用一个算法时首先看你使用的容器中是否有这个算法,如果有的话,就用容器本身有的
(注意不能使用泛化的,因为泛化的可能不能用这个容器,或者没有容器自带的效率高)
如果没有的话,就使用泛化的
注意这几个例子:图片左边是算法的实现,右边是哪个容器本身有这个算法
count和count_if使用
源码:
/**对谓词为真的序列的元素进行计数。 * @brief Count the elements of a sequence for which a predicate is true. * @ingroup non_mutating_algorithms * @param __first An input iterator. * @param __last An input iterator. * @param __pred A predicate. * @return The number of iterators @c i in the range @p [__first,__last) * for which @p __pred(*i) is true.*/templateinline typename iterator_traits<_InputIterator>::difference_typecount_if(_InputIterator __first, _InputIterator __last, _Predicate __pred){ return std::__count_if(__first, __last, __gnu_cxx::__ops::__pred_iter(__pred));}
使用:
//// Created by lk on 18-6-4.//#include#include #include #include using namespace std;bool myfun(int i){ return i > 4;}struct myClasss{ bool operator()(int i){ return i > 4;}}myObjj;int main(){ // 泛化的 vector vec = { 1,2,3,4,5,5,6,3,4}; auto num = count(vec.begin(), vec.end(), 3); cout << "vec中3的个数为"<< num << endl; auto t = count_if(vec.begin(), vec.end(), myfun); auto t2 = count_if(vec.begin(), vec.end(), myObjj); cout << t << " " << t2 << endl; // 结果为3 3 // 容器本身自带的函数 set s1 = { 1,2,3,4,5}; auto s_num = s1.count(3); cout << s_num << endl; // 1 return 0;}
find方法:
template_IIter find(_IIter, _IIter, const _Tp&); template _FIter1 find_first_of(_FIter1, _FIter1, _FIter2, _FIter2); template _FIter1 find_first_of(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate); template _IIter find_if(_IIter, _IIter, _Predicate);
//// Created by lk on 18-6-4.//#include#include #include #include using namespace std;namespace luck_count{ bool myfun(int i){ return i > 4;} struct myClasss{ bool operator()(int i){ return i > 4;} }myObjj; int test_count() { // 泛化的 vector vec = { 1,2,3,4,5,5,6,3,4}; auto num = count(vec.begin(), vec.end(), 3); cout << "vec中3的个数为"<< num << endl; auto t = count_if(vec.begin(), vec.end(), myfun); auto t2 = count_if(vec.begin(), vec.end(), myObjj); cout << t << " " << t2 << endl; // 结果为3 3 // 容器本身自带的函数 set s1 = { 1,2,3,4,5}; auto s_num = s1.count(3); cout << s_num << endl; // 1 return 0; }}namespace luck_find{bool myFun(int i) { return i > 2;}struct MyClass{ bool operator()(int i) { return i > 2;}}myObj; void test() { vector vec = { 1,2,3,4,5,5,6,3,2}; auto it = find(vec.begin(), vec.begin()+5, 6); cout << "it是6的迭代器地址" << endl; auto it2 = find_if(vec.begin(), vec.end(), myFun); cout << "use custom functional" << endl; cout << "it2是大于2的迭代器地址" << endl; auto it3 = find_if(vec.begin(), vec.end(), myObj); cout << "use custom object" << endl; cout << "it3是大于2的迭代器地址" << endl; }}int main(){ luck_count::test_count(); luck_find:: test(); return 0;}
sort用法
包含仿函数
/**使用比较的谓词来排序序列的元素。 * @brief Sort the elements of a sequence using a predicate for comparison. * @ingroup sorting_algorithms * @param __first An iterator. * @param __last Another iterator. * @param __comp A comparison functor. * @return Nothing. * * Sorts the elements in the range @p [__first,__last) in ascending order, * such that @p __comp(*(i+1),*i) is false for every iterator @e i in the * range @p [__first,__last-1). * * The relative ordering of equivalent elements is not preserved, use * @p stable_sort() if this is needed. */templateinline voidsort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp){ // concept requirements __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< _RandomAccessIterator>) __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, typename iterator_traits<_RandomAccessIterator>::value_type, typename iterator_traits<_RandomAccessIterator>::value_type>) __glibcxx_requires_valid_range(__first, __last); __glibcxx_requires_irreflexive_pred(__first, __last, __comp); std::__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));}
#include#include #include #include #include namespace luck_sort{ void print(vector &vec) { for (auto item : vec) cout << item << " "; cout << endl; } bool myfun(int i, int j){ return i > j;} struct myclass{ bool operator ()(int i, int j){ return i < j;} }myObj; // 仿函数对象省略了 void test() { vector vec = { 1,2,5,6,2,3,0,-3}; sort(vec.begin(), vec.end()); cout << "use default 谓词"<