
CC++ stl 逻辑层
文章平均质量分 72
软件架构师何志丹
我的源码、视频、博文、电子书可复用性、可理解性、可测试性皆强。优于工作,劣于竞赛。源码:https://gitcode.com/invite/link/a07392368f3a4ae295c0
展开
-
经典算法:最短点对
我的解决方式是:a,三种解法,看结果是否一致。b,小数据(100个点),人工排查。第一种方法,暴力法适合小数据。第二种方法:我的改进型。第三种方法:经典方法(分治法)。实验证明1000万数据时,我的算法有优势。我的改进型要点:先对所有数据按Y排序。只比较y距离小于等于已知最小距离的点对。经典方法:按Y排序,分成两部分,递归调用。合并时只比较距离分界线不超过已知最小距离的点对。实际证明500万数据以下,我的改进算法明显优于经典算法;1000万数据时,略强于经典算法。旧文新发,改了错别字,死链等。原创 2023-09-27 18:03:31 · 185 阅读 · 1 评论 -
for (int i = 0; i < v.size() - 1; i++)
std::vector<int> v; for (int i = 0; i < v.size() - 1; i++) { int x = v[i]; }此代码会异常,原因:v.size() 的结果是UINT的0,减去1后,就是40多亿。或者-1转成UINT就是这么多。...原创 2022-01-07 11:31:48 · 872 阅读 · 0 评论 -
__FILE__, __LINE__ __FUNCTION__
__FILE__, __LINE__ 是ANSI C语言标准,各种C编译器都应当支持。而 __FUNCTION__ 是C99标准,故一些老的编译器就不支持。如gcc支持__FUNCTION__,而vc6就不支持。重申一遍,这些宏是编译器内置宏,无法定义,也不需要定义,就如c语言关键字一样。经测试:1,cygwin 1.7.9-1 gcc-g++ 3.4.4-999测试3者都支持原创 2015-10-22 16:10:45 · 450 阅读 · 0 评论 -
linux下的GetTickCount
unsigned long GetTickCount(){ struct timespec ts; clock_gettime(CLOCK_MONOTONIC,&ts); return (ts.tv_sec * 1000 + ts.tv_nsec/(1000*1000) );}cygwin下测试结果恒为0,linux实测结果正确。原创 2016-05-18 14:40:37 · 2516 阅读 · 0 评论 -
MFC exe使用C++ dll中的std::string 崩溃
VC6中MFC exe中 new 纯C++ dll dll崩溃我把纯C++的 dll,用/MTd 换成/MDd,就可以了原创 2015-08-02 00:13:08 · 2101 阅读 · 0 评论 -
VC7(VS2002)调试时 std::string 超过15字符乱码问题
VC7(VS2002)调试时 std::string 超过15字符乱码问题std::string str = "1234567890123456"; const char* p = str.c_str();调试时:str的值是乱码,p是正确值。可能是VS2002的bug,根源可能是:std::string 不超过15字符保存在_Bx.Buf中,否原创 2015-07-29 17:27:37 · 1370 阅读 · 0 评论 -
std::wstring跨dll 崩溃
今天用个测试exe调用了个dll,有个接口返回std::wstring,经调试发现挂在该函数return之后,怀疑是string不适合作为返回值,百度一番发现下面这篇解释的很详细。STL跨平台调用会出现很多异常,你可以试试.STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下面是详细解释。原创 2015-08-01 23:02:18 · 2024 阅读 · 0 评论 -
[VC6]std::vector派生类无法调用std::vector的解决方法
[VC6]std::vector派生类无法调用std::vector的解决方法template >class CTestVector : public std::vector{ public: void clear() { std::vector::clear(); }};调用代码CTestVector vv; vv.clear();出原创 2016-01-16 20:50:53 · 2041 阅读 · 0 评论 -
C++ 利于宏模拟C#的正则表达式
C# 有个用法var retList = listString.Where(u => u.Length > 4);将listString中的 Length 大于4的 成员放到 retList中。这个功能大大减轻了 工作量 class A{public: A() { x = "def"; }; CString x ;};#defin原创 2016-03-27 10:50:48 · 541 阅读 · 0 评论 -
最简单的makefile
hello.c的内容如下:#include int main(){ printf("Hello World!\n"); return 0;}makefile 的内容如下:hello.exe : hello.o gcc -o hello.exe hello.ohello.o : hello.c gcc -c hello.c原创 2015-06-16 18:00:38 · 723 阅读 · 0 评论 -
cygwin的下的gcc的一点体会。
cygwin的下的gcc的一点体会。1,源文件的扩展名为c,按C的规则编译;源文件的扩展名为cpp,按C++的规则编译。注意:两者默认包括的文件也不同。2,gcc -o hello hello.o 按c方式生成exe。g++ -o hello hello.o 方式生成exe。c方式的主函数int main(){ return 0;}C++方式的主函数int原创 2015-06-16 15:46:50 · 686 阅读 · 0 评论 -
cygwin的下的gcc的一点体会。
1,源文件的扩展名为c,按C的规则编译;源文件的扩展名为cpp,按C++的规则编译。注意:两者默认包括的文件也不同。2,gcc -o hello hello.o 按c方式生成exe。g++ -o hello hello.o 方式生成exe。c方式的主函数int main(){ return 0;}C++方式的主函数int main(int argc,char原创 2015-06-16 15:45:43 · 1047 阅读 · 0 评论 -
字符串替换无效
软件架构师何志丹字符串替换无效CString str = _T("\03ab"); str.Replace(_T("\0x3"),_T("X"));\0x改成\x就好了str.Replace(_T("\x3"),_T("X"));原创 2018-01-29 09:46:31 · 612 阅读 · 0 评论 -
根据圆心角求离心角
软件架构师何志丹本文架设:椭圆长轴在X轴,椭圆中心点在坐标原点。这两个架设不影响,“圆心角”和离心角。令椭圆中心点为O,长轴半长为a,短轴半长为b。以O为中心,b为半径做圆,以下简称小圆。以O为中心,a为半径做圆,以下简称大圆。以O为端点,任意离心角度t,作射线,交...原创 2018-08-03 19:05:41 · 685 阅读 · 0 评论 -
推导坐标旋转公式
软件架构师何志丹O是坐标原点,A(x0,y0)移动前的点,B是移动后的点(x1,y),AC垂直于X轴,垂直C。BD垂直于X轴,垂直D。令a= AOC b= AOB。因为OA、OB都是同一圆的半径,所以OA=OB,所以|BD|/sin(a+b...原创 2018-08-03 19:08:21 · 485 阅读 · 0 评论 -
根据”圆心角“求斜椭圆坐标
软件架构师何志丹根据“圆心角”弧度(函数会将圆心角转成离心角),获取斜椭圆上的点坐标。ptCenter,椭圆中心;a椭圆长轴长度;b,椭圆短轴长度;radian,点于椭圆长轴夹角的弧度;dChangZhouAngle,长轴弧度 CDou...原创 2018-08-01 20:22:12 · 3681 阅读 · 1 评论 -
正椭圆的参数方程证明
软件架构师何志丹本文只讨论长轴和轴平行且中心点在原点的椭圆标准方程:x2/a2+y2/b2=1,令A=x/a,B=y/b,则标注方程可以变形为A2+B2=...原创 2018-08-01 20:24:44 · 1467 阅读 · 0 评论 -
std::string 跨进程可能崩溃
MFC的CString 暂时没发现此问题。 c++标准值保证数组可以跨dll原创 2016-05-24 19:12:34 · 721 阅读 · 0 评论 -
std::string 不能跨dll的一种解决方法
如果函数很重要,那直接将实现放到头文件//此函数违反声明与实现相分离的原因://stl跨dll会崩溃,理论上调用方的工程属性和本dll完全一样可以解决//此函数很通用,调用的dll或exe太多,很难一致。//C++标准只规定数组可以跨dll//static是防止某个项目(工程)的多个源文件使用了此函数而引起的重定义,理论上inline也可以解决重定义的问题。原创 2016-05-31 11:30:17 · 3581 阅读 · 0 评论 -
读loki:TYPEList有感一
问题一,简化版的TYPEList,只支持int型templateclass TYPEList{public: int Head; TYPEList Tail;};templateclass TYPEList{public: int Tail; int Head; };测试代码TYPEList l0; l0.Head = 1;原创 2015-01-22 14:09:17 · 841 阅读 · 0 评论 -
读loki有感,TYPEList原理
读loki有感,TYPEList原理问题一,简化版的TYPEList,只支持int型templateclass TYPEList{public: int Head; TYPEList Tail;};templateclass TYPEList{public: int Tail; int Head; };测试代码TYPEList l原创 2015-01-22 18:03:57 · 1058 阅读 · 0 评论 -
读loki有感 : 编译事(而不是运行时)的断言(assert)
本文环境:VS2005(VC8)问题一:如果int不是64位,编译无法通过。char test[sizeof(int)==8];//如果此行编译不过,原因:系统不是64位原理:数组的元素不能为0。类似情况:Window的int低位在前,高为在后。linux相反,安卓是基于linux的。问题二:较大类别不能转化成较小类别,比如:int到char。templateT原创 2015-01-23 12:04:09 · 974 阅读 · 0 评论 -
loki仿函数原理
loki仿函数原理问题一:已知函数Fun有2个参数,请完成CTestFunctor类,使得CTestFunctor的()实际调用Fun,部分代码如下:#include using namespace std ;class CTestCommand{public: void operator()(int x,double y) { cout }};原创 2015-01-26 12:07:35 · 911 阅读 · 0 评论 -
loki有感: 访问者模式
一,请输出类名和m_x值。不需要处理CRoot类,只需处理A,B类。CRoot还有一些派送类,也不考虑。class CRoot{public: int m_x;};class A : public CRoot{public: A() { m_x = 1; } };class B : public CRoot{public:原创 2015-01-27 15:44:08 · 798 阅读 · 0 评论 -
boost::any( 能存放任何类型的数据)原理
=====================templateclass any{public: T m_data;};void main(){ any a; }缺点是 必须知道类型,有时我们并不知道某个对象的类型。-------------class any{public: template any原创 2015-01-27 18:03:26 · 1297 阅读 · 0 评论 -
UnSignType
templateclass UnSignType{ //如果缺少Type 请用UNSIGN_TYPE宏添加偏特化};#define UNSIGN_TYPE(t) \templatestruct UnSignType \{\ typedef unsigned t TYPE;\};UNSIGN_TYPE(char)UNSIGN_TY原创 2015-02-05 11:39:53 · 745 阅读 · 0 评论 -
二进制文件与文本文件的区别
{ const char* p = "\r\n"; std::ofstream f1("d:\\1.a"); f1.write(p,strlen(p)); f1.close(); std::ofstream f2("d:\\2.a",std::ios::binary); f2.writ原创 2016-07-30 16:21:10 · 392 阅读 · 0 评论 -
计算24点
计算24 何志丹 问题描述: 有四个整数(0到10),运算符只有加减乘除,还有括号,每个数能且只能用一次,要求判断这些表达的结果中是否有24,如果有,输出过程,格式如下: 4*6*1*1 .(允许有括号).注意:1,中间结果允许出原创 2003-07-29 08:17:00 · 11774 阅读 · 8 评论 -
try catch整个函数
#include "stdafx.h"#include using namespace std;int _tmain(int argc, _TCHAR* argv[]) try{ char* p = NULL ; *p = 'a'; return 0;}catch(...){ cout }原创 2015-10-22 16:54:08 · 2298 阅读 · 0 评论 -
随机数一
#include #include using namespace std ;#include #include //C语言的库函数rand有以下两个可改进之处//范围太小,才3万多,改成40亿多//需要srand,如果不srand 默认只是1。CRand默认值是clock()。注意:Windows下GetTickCount更精确#define ULONG原创 2015-02-06 11:09:12 · 792 阅读 · 0 评论 -
C语言和VC视频教程
C语言视频教程打包下载http://pan.baidu.com/share/link?shareid=593441&uk=4280148702VC视频教程打包下载http://pan.baidu.com/share/link?shareid=593445&uk=4280148702 TC3安装视频: 新浪在线收看TC3简单使用: 新浪在线收看在线收看《为什么原创 2013-05-28 11:26:16 · 3587 阅读 · 4 评论 -
日常总结一:下面的代码会崩溃么?
如果文件夹不存在,建立文件会崩溃。string strDir = "d:\\" + System.DateTime.Now.DayOfYear.ToString() ; System.IO.Directory.CreateDirectory(strDir); string strFileName = "d:\\" + Syst原创 2017-03-07 10:25:48 · 397 阅读 · 0 评论 -
干扰数
开发环境VS2005(VC8)#include #include using namespace std ;#include #define ULONG unsigned long//干扰数的意义//当要连续调用rand的时候,几个rand关联性太强,可以rand()+干扰数class IGanRaoShu //干扰数,取一个数,分布没有任何规律,可以重原创 2015-02-06 18:22:28 · 959 阅读 · 0 评论 -
读boost::multi_array有感,多维数组实现(非类型模板,偏特化)
本文做如下简化:1,假定所有维元素都是5。2,不考虑const的[]。3,由于只是熟悉原理,不考虑各种异常情况。问题一,请实现一个一维整形数组,只需重载[]。问题二,请实现一个二维整形数组,只需重载[]。源码如下:class CIntArray1{public: int& operator[](int index) {原创 2015-01-21 12:07:03 · 1334 阅读 · 0 评论 -
将容器中(数组、集合)的数据串成字符串
开发工具VC7(VS2002) 核心代码用到MFC,测试代码用到stl 本代码功能,将容器中(数组、集合)的数据串成字符串//核心代码templateclass IGetEleStr{public: virtual CString GetStr(const TYPE& ele) const =0 ;};class IGetSpe{原创 2015-01-14 16:44:52 · 1136 阅读 · 0 评论 -
VS2005 Debug版,dll /MTd,exe /MDd的潜在bug
VS2005 Debug版,dll /MTd,exe /MDd的潜在bugdll中:void DoStr(std::string& str){ str += "12345678901234";}exe中void CtestexeDlg::OnBnClickedButton1(){ std::string str = "1"; DoStr(str);}原创 2016-06-02 10:12:39 · 575 阅读 · 0 评论 -
读loki有感,编译阶段发现两个类能否转化
开发环境:VS2005(VC8)以下代码在VS2002上运行不了,据说VS2002(VC7)不完全支持偏特化,VS2003(VC7.1)就支持了。问题提出:一,已知类型T,U,在编译阶段如何知道T能否转化成U。template struct ConversionHelper{ static long Test(...);//WQ注:C++中,不定参数已不需要“至少一原创 2015-01-21 18:04:59 · 954 阅读 · 0 评论