鉴于个人习惯,将所有的文件都放到了jtianling目录下,一般的函数放到jtianling.h和jtianling.cpp中,其他的分类按文件放置,这样要包含文件就需要用include “jtianling/jtianling.h”形式包含,而且要在设置里面将jtianling这个目录包含进去
jtianling.h
———————————————————————————————
//-------Created By 九天雁翎(jtianling) Email:jtianling@gmail.com
//-------最后修改时间:3.26
//这个小库为了方便,特化了map和multimap所以包含进了<map>
//因为需要string和算法,包含了<algorithm>,<string>
//做这个库的目的本来就是简化一些学习C++的过程
//所以至于效率和文件的大小都没有那么太在乎了,毕竟不是工业级的应用:)
//最近在其中加入了算法效率比较的函数和随机数组创建函数
#ifndef JTIANLING_H
#define JTIANLING_H
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
namespace jtianling
{
//容器输出部分
//以容器为输入的简化函数,第二参数为前置的string,默认为空
template <typename T>
void PrintCon(const T &orig, const std::string &str = "")
{
std::cout << str;
typename T::const_iterator it;
for(it = orig.begin(); it != orig.end(); ++it)
{
std::cout << *it <<" ";
}
std::cout << std::endl;
}
//特化map,multimap的模板,因为map,multimap的迭代器调用与一般容器有所不同
template<typename T1, typename T2>
void PrintCon(const std::map<T1, T2> &origMap,
const std::string &str = "")
{
std::cout << str;
typename std::map<T1, T2>::const_iterator it;
for(it = origMap.begin(); it != origMap.end(); ++it)
{
std::cout << it->first << ":" << it->second << "; ";
}
std::cout << std::endl;
}
template<typename T1, typename T2>
void PrintCon(const std::multimap<T1, T2> &origMultimap,
const std::string str = "")
{
std::cout << str;
typename std::multimap<T1, T2>::const_iterator it;
for(it = origMultimap.begin(); it != origMultimap.end(); ++it)
{
std::cout << it->first << ":" << it->second << "; ";
}
std::cout << std::endl;
}
//以参数数量不同,重载容器输出函数,以迭代器为输入,方便输出容器的一部份甚至数组,
//第三参数为前置的string,默认为空,因为输出部分map,multimap个人较少用到,所以不特
//化了,有需要的可以自己仿照特化响应模板
template <typename Iter>
void PrintCon(Iter itBegin, Iter itEnd, const std::string &str = "")
{
std::cout << str;
for( NULL; itBegin != itEnd; ++itBegin)
{
std::cout << *itBegin << " ";
}
std::cout << std::endl;
}
//-------------------------------------------------------------------
//时间获取部分
double GetTime(); //使用高精度计时器
//因为这里主要是比较不同算法的实现,所以这里不区分算法及其实现,都称为算法
//比较算法的函数,其中算法函数的参数为数组(array)和整数(int)
//简写为AI,为了防止混乱,这里我没有使用函数的重载
//准备以后有新的不同参数的算法时再加入新的比较函数
//方便最后查看对比我没有使用常规的屏幕输出而是输出到文件
//输出文件名为CompareAlogorithmAIResult.txt
//而且此文件可以用Excel打开,比较清晰,方便保存
//比较函数的参数解释如下:
//第一参数:各算法的用vector<>表示的函数指针数组
//第二参数:vector<int>表示的一系列算法函数第二参数,用以做算法增长比较
//主要注意的是,这里的第二参数实际也是算法函数第一参数数组的大小
typedef void (*pfAI)(int [], int);
void CompareAlgorithmAI(const std::vector<pfAI> &pfAIVec,const std::vector<int>& vec);
//比较算法的函数,其中算法函数的参数为整数(int)
//简写为I,方便最后查看对比我没有使用常规的屏幕输出而是输出到文件
//输出文件名为CompareAlogrithmIResult.txt
//而且此文件可以用Excel打开,比较清晰,方便保存
//比较函数的参数解释如下:
//第一参数:各算法的用vector<>表示的函数指针数组,
//第二参数:vector<int>表示的一系列算法函数第二参数,用以做算法增长比较
typedef void (*pfI)(int);
void CompareAlgorithmI(const std::vector<pfI> &pfIVec,const std::vector<int>& vec);
}//end of jtianling namespace
#endif
//-------Created By 九天雁翎(jtianling) Email:jtianling@gmail.com
//-------最后修改时间:.3.26
#include "jtianling.h"
#include <iomanip>
#include <fstream>
#include "windows.h"
namespace jtianling
{
double GetTime() //使用高精度计时器
{
static LARGE_INTEGER s_freq;
LARGE_INTEGER performanceCount;
double t;
if (s_freq.QuadPart==0)
{
if ( !QueryPerformanceFrequency( &s_freq))
return 0;
}
QueryPerformanceCounter( &performanceCount );
t=(double)performanceCount.QuadPart / (double)s_freq.QuadPart;
return t;
}
//因为这里主要是比较不同算法的实现,所以这里不区分算法及其实现,都称为算法
//比较算法的函数,其中算法函数的参数为数组(array)和整数(int)
//简写为AI,为了防止混乱,这里我没有使用函数的重载
//准备以后有新的不同参数的算法时再加入新的比较函数
//比较函数的参数解释如下:
//第一参数:各算法的用vector<>表示的函数指针数组
//第二参数:vector<int>表示的一系列算法函数第二参数,用以做算法增长比较
//主要注意的是,这里的第二参数实际也是算法函数第一参数数组的大小
void CompareAlgorithmAI(const std::vector<pfAI> &pfAIVec,const std::vector<int>& vec)
{
double timeInAll = GetTime(); //这里保存所有比较花费的时间
std::ofstream out("CompareAlogrithmAIResult.txt");//将结果保存在这里
//在文件中输入第一行
out <<"parameter" <<'/t';
for(int i=0; i<pfAIVec.size(); ++i)
{
out <<"Algorithm " <<i+1 <<'/t';
}
out <<std::endl <<std::setprecision(4) <<std::scientific;
double timeTaken; //每个算法一次消耗的时间
//以算法参数的数组个数为循环条件,每个数值让各个算法分别调用
for(int i=0; i<vec.size(); ++i)
{
out <<vec[i] <<'/t';
int *arr = new int[ vec[i] ]; //每次动态生成一个数组
for(int j=0; j<pfAIVec.size(); ++j)
{
timeTaken = GetTime();
pfAIVec[j](arr, vec[i]); //实际调用不同算法
timeTaken = GetTime() - timeTaken;
out <<timeTaken <<'/t';
}
delete []arr; //删除arr,因为只考察算法的效率,所以根本不关心结果
//至于各算法是否正确由调用者保证
out<<std::endl;
}
timeInAll = GetTime() - timeInAll;
out <<"Compared time in all: " <<timeInAll <<std::endl;
}
void CompareAlgorithmI(const std::vector<pfI> &pfIVec,const std::vector<int>& vec)
{
double timeInAll = GetTime(); //这里保存所有比较花费的时间
std::ofstream out("CompareAlogrithmIResult.txt");//将结果保存在这里
//在文件中输入第一行
out <<"parameter" <<'/t';
for(int i=0; i<pfIVec.size(); ++i)
{
out <<"Algorithm " <<i+1 <<'/t';
}
out <<std::endl <<std::setprecision(4) <<std::scientific;
double timeTaken; //每个算法一次消耗的时间
//以算法参数的数组个数为循环条件,每个数值让各个算法分别调用
for(int i=0; i<vec.size(); ++i)
{
out <<vec[i] <<'/t';
for(int j=0; j<pfIVec.size(); ++j)
{
timeTaken = GetTime();
pfIVec[j](vec[i]); //实际调用不同算法
timeTaken = GetTime() - timeTaken;
out <<timeTaken <<'/t';
}
out<<std::endl;
}
timeInAll = GetTime() - timeInAll;
out <<"Compared time in all: " <<timeInAll <<std::endl;
}
}
//-------Created By 九天雁翎(jtianling) Email:jtianling@gmail.com
//-------最后修改时间:.3.26
#ifndef RAND_H
#define RAND_H
namespace jtianling
{
//还是需要自己设定种子,此函数只保证范围
//此算法生成从lowBorder到highBorder的随机数,而且包括边界lowBorder,highBorder.
//即lowBorder=<n<=highBorder
int RandIntInRange(int lowBorder, int highBorder);
//算法描述如<<Data Structures and Algorithm Analysis in C++>>
//By Mark Allen Weiss 题目.8算法所示,根据习惯,不对outArray[]的大小做任何检验,
//调用此函数的人应该确保这一点,即outArray的大小大于等于numOfArray
//此算法的用途是高效地产生一个不重复的随机序列
//且此序列正好包括(1,numOfArray)中所有自然数
void RandArrayNoRepeatInN(int outArray[], int numOfArray);
//此算法产生随机的不重复的数组,数组大小为N
//利用set容器的特性来保证没有重复,因为set容器的查找远快于一个一个查找
//所以此方法比<<Data Structures and Algorithm Analysis in C++>>
//By Mark Allen Weiss 题目.8算法所示算法快,而且增长慢很多
void RandArrayNoRepeat(int outArray[], int numOfArray);
//产生一个的随机序列且此序列的数值只在(1,numOfArray)中
void RandArrayInN(int outArray[], int numOfArray);
//产生一个随机的序列,且序列的值为完全随机,序列的大小由numOfArray指定
void RandArray(int outArray[], int numOfArray);
}//end of namespace jtianling
//-------Created By 九天雁翎(jtianling) Email:jtianling@gmail.com
//-------最后修改时间:.3.28
#include "rand.h"
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <set>
namespace jtianling
{
//此算法生成从i到j的随机数,而且包括边界i,j.即i=<n<=j
int RandIntInRange(int i, int j)
{
//确保i<j,不然就交换
if(i > j)
{
int temp = i;
i = j;
j = temp;
}
//确保范围正确
return rand()%(j-i+1) + i;
}
//算法描述如<<Data Structures and Algorithm Analysis in C++>>
//By Mark Allen Weiss 题目.8算法所示,根据习惯,不对arr[]的大小做任何检验,
//调用此函数的人应该确保这一点,即arr的大小大于等于n
//此算法的用途是高效地产生一个不重复的随机序列
//且此序列正好包括(1,n)中所有自然数
void RandArrayNoRepeatInN(int arr[], int n)
{
srand(time(NULL) );
for(int i=0; i<n; ++i)
{
arr[i] = i + 1;
}
for(int i=0; i<n; ++i)
{
std::swap(arr[i], arr[RandIntInRange(0, i)] );
}
}
//此算法产生随机的不重复的数组,数组大小为N
//利用set容器的特性来保证没有重复,因为set容器的查找远快于一个一个查找
//所以此方法比<<Data Structures and Algorithm Analysis in C++>>
//By Mark Allen Weiss 题目.8算法所示算法快,而且增长慢很多
void RandArrayNoRepeat(int arr[], int n)
{
srand(time(NULL) );
std::set<int> intSet;
int temp;
for(int i=0; i<n; ++i)
{
while(true)
{
temp = rand();
if(!intSet.count(temp))
{
arr[i] = temp;
intSet.insert(temp);
break;
}
}
}
PrintCon(arr, arr+n);
}
//产生一个的随机序列且此序列的数值只在(1,n)中,序列的大小由n指定
void RandArrayInN(int arr[], int n)
{
srand(time(NULL) );
for(int i=0; i<n; ++i)
{
arr[i] = RandIntInRange(0, n);
}
}
//产生一个随机的序列,且序列的值为完全随机,序列的大小由n指定
void RandArray(int arr[], int n)
{
srand(time(NULL) );
for(int i=0; i<n; ++i)
{
arr[i] = rand();
}
}
}//end of namespace jtianling
分享到:
相关推荐
C++string常用函数,c++文件流操作,C++中的日期和时间
C++string类常用函数 C++string类常用函数
c++常用三角函数,入门基础练习
C++常用函数大全,包含参数说明,函数分类列表
C++常用类和API函数C++常用类和API函数C++常用类和API函数
在类定义中如果没有提供自己的拷贝构造函数,则C++提供一个默认的构造函数,其拷贝策略是逐个成员依次拷贝。 深拷贝和浅拷贝 默认拷贝构造函数均是浅拷贝 但是一个类可能拥有其它资源,如其构造函数分配了一个堆内存...
日期类Date包含日期的年、月、日三个数数据成员,编写一个友元函数,求两个日期之间相差的天数; 重要的是理顺:这个函数不是Date类的成员函数
编写黑客软件常用实用函数 软件名称: 开发包基础库 单元名称: 公共运行时间库单元 单元版本: V1.0 备 注: 该单元定义了组件包的基础类库 开发平台: PWin98SE + Delphi 6.0 兼容测试: PWin9X/2000/XP + ...
(3)编写重载函数Maxl可分别求取两个整数,三个整数,两个双精度数,三个双精度数的最大值。 (4)使用重载函数模板重新实现上小题中的函数Maxl。 (5)使用系统函数pow(x,y)计算xy的值,注意包含头文件math.h。 ...
C++ 线程函数是类的成员函数 C++ 线程函数是类的成员函数
c++开发过程中经常遇到的一些工具型函数,如字符拆分
开发过程中的一些实用工具函数源码:获得当前程序的路径、获得ini文件内容、设置ini文件内容、获得ini的节点名称、校验文件/路径是否存在、创建路径、获得/写入文件内容/遍历文件夹、字符串转换、文件复制、字符编码...
C++builder常用函数,C++builder常用函数
c++常用函数, boost, 文件操作, C++常用查询手册
string类常用函数 包括各种方法 c++ c语言
为了验证C++类间函数的相互调用,利用VC6.0的对话框和任意一个逻辑类,实现了点击对话框按钮-〉调用逻辑类函数-〉在对话框显示运行结果的功能
APIHook、InlineHook库,使用C++11编写,可将回调函数绑定到类成员函数。代码风格良好,适合学习。
用c++设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期减去天数、两日期相差的天数等。
一 函数重载 二函数模板 三类模板 的说明及代表代码
练习 C++中函数模板、类模板的创建和使用方法。 (1) 理解模板的作用。 (2) 学习函数模板及其声明方法,掌握模板函数及其生成方法。 (3) 学习函数模板的两种不同的实例化方法。 (4) 学习类模板的声明与使用方法。