一、c++标准库算法,是什么东西
(1)算法需要知道当前处于什么容器,可以帮助算法找到当前最有效率的动作。算法问迭代器问题。
(2)算法形式第二版本,Cmp是一个criteria准则,比如排大小,是一个functors
(3)算法与容器没有关联,通过iterator管理,各自闭门造车、
二、各种容器的iterator_category
random是可以跳跃的,连续空间可以跳跃random_access_iterator_tag
bidirectionl_iteratory_tag:双向
forward_iterator_tag:单向
为什么迭代器类型不同?不用1,2,3,4,5表示,而表现为class
(1)可以通过函数重载overloading进入到对应函数中处理,这是为什么没有用1,2,3,4,5标记,例子如下
#include <iostream> // std::cout
#include <iterator> // std::iterator_traits
#include <typeinfo> // typeid
#include <array>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <map>
#include <set>
#include <list>
#include <deque>
#include <forward_list>
using namespace std;
namespace jj33
{
// 函数重载overloading
void _display_category(random_access_iterator_tag)
{ cout << "random_access_iterator" << endl; }
void _display_category(bidirectional_iterator_tag)
{ cout << "bidirectional_iterator" << endl; }
void _display_category(forward_iterator_tag)
{ cout << "forward_iterator" << endl; }
void _display_category(output_iterator_tag)
{ cout << "output_iterator" << endl; }
void _display_category(input_iterator_tag)
{ cout << "input_iterator" << endl; }
template<typename I>
void display_category(I itr)
{
typename iterator_traits<I>::iterator_category cagy;
_display_category(cagy);
cout << "typeid(itr).name()= " << typeid(itr).name() << endl << endl; //可以同typeid得到迭代器类型
//The output depends on library implementation.
//The particular representation pointed by the
//returned valueis implementation-defined,
//and may or may not be different for different types.
}
void test_iterator_category()
{
cout << "\ntest_iterator_category().......... \n";
display_category(array<int,10>::iterator());
display_category(vector<int>::iterator());
display_category(list<int>::iterator());
display_category(forward_list<int>::iterator());
display_category(deque<int>::iterator());
display_category(set<int>::iterator());
display_category(map<int,int>::iterator());
display_category(multiset<int>::iterator());
display_category(multimap<int,int>::iterator());
display_category(unordered_set<int>::iterator());
display_category(unordered_map<int,int>::iterator());
display_category(unordered_multiset<int>::iterator());
display_category(unordered_multimap<int,int>::iterator());
display_category(istream_iterator<int>());
display_category(ostream_iterator<int>(cout,""));
}
}
int main() {
jj33::test_iterator_category();
}
三、两种特别的迭代器istream_iterator,oustream_iterator
派生类继承类基类的typedef
四、iterator_category对算法的影响
(1)迭代器分类对算法效率的影响,判断迭代器属于哪一种类型,可以加快算法速度
(2)如果没有提供对应的迭代器类型,可以看一下是否有父类型的函数重载,类的继承的好处(为什么使用类描述不同的迭代器类型)
(3)STL function有个特点,他的接口都是iterator,但是在用的时候传入容器的iterator或者说传入数据的指针都可以work这个背后的机理是什么?[1]函数重载 [2]iterator_traits作为间接层,可以得到5中iterator associated types
如何判断是否trivial?比如设计复数cpmlex,析构,等号赋值都不重要trivial
五、算法源码中对iterator_category的暗示
算分对迭代器的分类有强制限制么?没有,比如sort接口没有强制迭代器需要random_acccess_iterator_tag这个类型,但是RandomAccessIterator表示类型有暗示
算法是模版函数,可以接受任何类型