20170403STL011_STL_算法和迭代器
2017-04-03 14:41
183 查看
STL六大组件:
1:六大组建结合图2:迭代器作用于容器之上,对容器的操作通过迭代器。
3:algorithm头文件(STL里面的算法头文件):
1:和之前的命名方式一样,前面带下划线的属于内部使用函数,不带下划线的是对外提供的接口,但是可能带下划线的我们也能访问和使用,但并不建议这样用。
2:for_each():
template<class InputIterator, class Function> Function for_each(InputIterator first, InputIterator last, Function fn) { while (first!=last) { fn (*first);//将给定范围内的元素全部用fn函数处理一遍。 ++first; } return fn; // or, since C++11: return move(fn); }调用示例:
#include <iostream> #include <vector> #include <algorithm> template<typename T> void Foo(T t) { std::cout << t + 1 << std::endl; } int main() { std::vector<int> vi; vi.push_back(1); vi.push_back(2); vi.push_back(3); vi.push_back(4); vi.push_back(5); vi.push_back(6); vi.push_back(7); vi.push_back(8); vi.push_back(9); vi.push_back(0); for_each(vi.begin(), vi.end(), Foo<int>); //模板函数传递的时候,这个函数本身是不存在的,模板函数本身可以看成一套设备,需要给原料才能出对应的产品 //传递的函数是有一定要求的,必须是传递一个参数。 /*std::vector<int>::iterator it = vi.begin();//作用于容器之上,通过迭代器来操作 for (; it != vi.end();++it) { std::cout << *it << std::endl; }*/ return 0; }
3:count_if():
template <class InputIterator, class UnaryPredicate> typename iterator_traits<InputIterator>::difference_type count_if (InputIterator first, InputIterator last, UnaryPredicate pred) { typename iterator_traits<InputIterator>::difference_type ret = 0; while (first!=last) { if (pred(*first)) ++ret; ++first; } return ret; }调用示例:
4:STL从这个图,把相关的一些东西分开了,可以看出STL的GP编程和OOP编程是背道而驰的,他把相关的一些东西分开了,而OOP思想是将所有的抽象成类,连在一起。
5:函数对象:
template<class _Ty = void> struct less : public binary_function<_Ty, _Ty, bool> { // functor for operator< bool operator()(const _Ty& _Left, const _Ty& _Right) const//里面就实现了operator()。 { // apply operator< to operands return (_Left < _Right); } };调用:
std::less<int> i; i(10, 20);这种对象就称为函数对象,他就是拿来当函数使用的。也称为仿函数。
6:绑定函数:
template<class _Fn2, class _Ty> inline binder2nd<_Fn2> bind2nd(const _Fn2& _Func, const _Ty& _Right) { // return a binder2nd functor adapter typename _Fn2::second_argument_type _Val(_Right); return (_STD binder2nd<_Fn2>(_Func, _Val)); }7:示例:
#include <iostream> #include <vector> #include <algorithm> #include <functional> int main() { std::vector<int> vi; vi.push_back(1); vi.push_back(2); vi.push_back(3); vi.push_back(4); vi.push_back(5); vi.push_back(6); vi.push_back(7); vi.push_back(8); vi.push_back(9); vi.push_back(0); std::less<int> i; i(10, 20); int a = std::count_if(vi.begin(), vi.end(), std::not1(bind2nd(std::less<int>(),3)));//相当于传递了一个函数对象进去。 //std::less<>()里面本应该传递两个参数,而count_if只会给他传递一个参数,此时需要用bind2nd或者bind1nd将其中一个参数绑定起来。 //此后再调用就只需要传递一个参数了。 //std::not1()可以对一个函数执行出来的值取反。 return 0; }
8:vector里面的iterator是一个随机访问迭代器。
注意点:反向迭代器的时候与正向的相同,都是在自己的方向上半闭半开,所以,正向迭代器不能访问end(),反向迭代器不可以访问rend()。否则就可能越界。反响迭代器的操作不符合大多数人的习惯,所以一般用的比较少。
9:list里面的迭代器是双向迭代器(bidirectional_iterator)。
10:SGI STL里面的iterator就是一个指针。没有设计成类的模式。
相关文章推荐
- 20170403STL011_STL_算法和迭代器
- 20170403STL011_STL_算法和迭代器
- 20170403STL011_STL_算法和迭代器
- 20170403STL011_STL_算法和迭代器
- 20170403STL011_STL_算法和迭代器
- 20170403STL011_STL_算法和迭代器
- 20170403STL011_STL_算法和迭代器
- 20170403STL011_STL_算法和迭代器
- STL 容器,算法,迭代器 总结
- const_iterator的使用,STL算法----copy(),输出迭代器---ostream_iterator()
- STL容器算法迭代器的设计理念
- STL的容器、算法与迭代器
- c++ STL常见算法和迭代器
- STL之容器、迭代器及算法知识总结
- STL的6大组件:容器、类属算法、迭代器、函数对象、适配器、分配器。
- STL之迭代器,序列容器, 算法
- 标准模板库 STL-1 编程题#1(Coursera 程序设计与算法 专项课程3;用法:迭代器 ostream_iterator,容器 set)
- STL中的容器、迭代器与算法
- STL 容器,算法,迭代器 总结
- STL(标准模板库)理论基础,容器,迭代器,算法