• 模板推导提高程序效率


    STL 中有copy 函数, 感觉的效率还可以提高些, 就试着使用模板推导的方式决定调用不同的函数,本事就是根据形参类型的不同而调用不同的函数 , 首先自定义最简单的2个类 ,  true_type 和 false_type , 详见如下代码, VS2008验证 OK 

    // algorithm.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <vector>
    #include <list>
    namespace algor{
    	struct true_type{};
    	struct false_type{};
    template <typename T>struct iterator_trait{
    	typedef false_type value_type;
    };
    
    template <>struct iterator_trait<int*>{
    	typedef true_type value_type;
    };
    
    template <>struct iterator_trait<char*>{
    	typedef true_type value_type;
    };
    
    template <typename Iter1, typename Iter2>inline Iter2 t_copy(Iter1 first, Iter1 end, Iter2 out){
    	typedef iterator_trait<Iter1>::value_type value_type;
    	return copy_impl(first, end, out, has_trivial_assign<value_type>::value_type());
    }
    template <typename T>struct has_trivial_assign{
    	typedef T value_type;
    };
    
    
    
    template <typename T>T* copy_impl(T* first, T* end, T* out, true_type){
    	memmove(out, first, (end-first)*sizeof(T));
    	return out + (end - first);
    }
    template <typename Iter1, typename Iter2>Iter2 copy_impl(Iter1 first, Iter1 end, Iter2 out, false_type){
    	while(first != end)
    	{
    		*out = *first;
    		++first;
    		++out;
    	}
    	return out;
    }
    }
    #define N 100000
    struct MyFoo{
    	char c;
    	MyFoo& operator=(const MyFoo& f){
    
    		c = f.c;
    		return *this;
    	}
    };
    using namespace std;
    using namespace algor;
    int _tmain(int argc, _TCHAR* argv[])
    {
    	MyFoo f;
    	vector<MyFoo> vect(N, f);
    	vector<MyFoo>::iterator first = vect.begin();
    	vector<MyFoo>::iterator end = vect.end();
    
    	list<MyFoo> t_list;
    	t_list.resize(N);
    	list<MyFoo>::iterator out = t_list.begin();
    	int arr[N] = {1,};
    	int brr[N] = {2,};
    	int* aarr = arr;
    	int* bbrr = brr;
    	t_copy(aarr, aarr+N, bbrr);
    	t_copy(first, end, out);
    	return 0;
    }
    

      

  • 相关阅读:
    几个可以通过curl查询公网IP的站点
    CentOS安装 netdata 实时监视 Linux 系统性能
    Linux用ifconfig设置IP、掩码、网关
    Linux添加用户(user)到用户组(group)
    使用密码登陆Amazon EC2
    ulimit 命令详解
    linux命令行光标移动技巧
    阿里云epel源
    用scp实现多服务器文件分发
    2019年春季第二周作业
  • 原文地址:https://www.cnblogs.com/misserwell/p/4092780.html
Copyright © 2020-2023  润新知