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

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

OpenSAL1.1 包含了算法导论中所有数据结构和算法以及其他内容,本资源为该算法的静态链接 内容如下(*号表示1.1版本新增内容): 数据结构:一般堆、二项堆、斐波那契堆、红黑树、通用散列(采用全域散列和完全散列技术)、不相交集合、任意维数组、高维对称数组。 图论算法(兼容有向图,无向图):广度和深度优先遍历、确定图是否存在回路、拓扑排序、强连通分支、欧拉环(欧拉路径)、最小生成树(Kruskal、Prim)、单源最短路径(3种)、每对顶点间最短路径(2种)、最大流(2种)等等。 代数算法:霍纳法则计算多项式和、矩阵乘法(2种)、方阵的LUP分解、解线性方程组(2种)、矩阵求逆(2种)、求伪逆矩阵(2种)、解正态方程组(2种)、最小二乘估计(2种)、多元最小二乘估计*、快速傅里叶变换、快速傅里叶逆变换、多维快速傅里叶变换、多维快速傅里叶逆变换、快速向量求卷积(单变量多项式乘积)、快速张量求卷积(多变量多项式乘积)、多项式除法*、快速方幂和算法。 序列算法:最长公共子序列、KMP序列匹配*、键值分离排序。 数论算法:大数类(兼容浮点数、整数、与内置类型兼容运算)*、RSA加解密系统*、解同余方程*、孙子定理解同余方程组*、Miller_Rabin素数测试(产生大质数)*、随机数(实数、大数)*、欧几里得算法*。 计算几何算法:确定任意一对线段是否相交*、凸包*、最近点对*。 运筹学:线性规划(单纯形法)*、分配问题*、最优二度子图*、多01背包问题*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值