c++标准库算法

一、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表示类型有暗示

算法是模版函数,可以接受任何类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值