随笔分类 -  C/C++

摘要:转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90621.html上文我简单的介绍了如何建立一个简单DLL,下面再我简单的介绍一下如何使用一个DLL。当一个DLL被生成后,它创建了一个.dll文件和一个.lib文件;这两个都是你需要的。要使用DLL,就需要载入这个DLL。隐式链接这里有两个方法来载入一个DLL;一个方法是捷径另一个则相比要复杂些。捷径是只链接到你.lib 文件并将.dll文件置入你的新项目的路径中去。因此,创建一个新的空的Win32控制台项目并添加一个源文件。将你做的DLL放入你的新项目相同的目录下。#includ 阅读全文
posted @ 2013-09-11 21:47 瓶哥 阅读(1089) 评论(0) 推荐(0)
摘要:转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90619.html初学DLL,结合教程,总结一下自己的所得,希望对DLL初学者们有所帮助。 动态链接库(DLL)是从C语言函数库和Pascal库单元的概念发展而来的。所有的C语言标准库函数都存放在某一函数库中。在链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数代码,并把这些函数代码添加到可执行文件中。这种方法同只把函数储存在已编译的OBJ文件中相比更有利于代码的重用。但随着Windows这样的多任务环境的出现,函数库的方法显得过于累赘。如果为了完成屏幕输出、消息处理、内存管理 阅读全文
posted @ 2013-09-11 21:45 瓶哥 阅读(407) 评论(0) 推荐(0)
摘要:STL中,函数被称为算法,也就是说它们和标准C库函数相比,它们更为通用。STL算法通过重载operator()函数实现为模板类或模板函数。这些类用于创建函数对象,对容器中的数据进行各种各样的操作。下面的几节解释如何使用函数和函数对象。一、函数和断言经常需要对容器中的数据进行用户自定义的操作。例如,你可能希望遍历一个容器中所有对象的STL算法能够回调自己的函数。例如 1 //for_each,find_if 2 #include 3 #include // Need rand(), srand() 4 #include // Need time() 5 #incl... 阅读全文
posted @ 2013-08-11 10:29 瓶哥 阅读(430) 评论(0) 推荐(0)
摘要:要学会使用迭代器和容器以及算法,需要学习下面的新技术。一、流和迭代器本书的很多例子程序使用I/O流语句来读写数据。例如:1 int value;2 cout > value;4 cout 3 #include // Need rand(), srand() 4 #include // Need time() 5 #include // Need sort(), copy() 6 #include // Need vector 7 #include // 坑爹的教程!!,Need for ostream_it... 阅读全文
posted @ 2013-07-26 14:51 瓶哥 阅读(569) 评论(0) 推荐(0)
摘要:一、容器迭代器尽管C++指针也是迭代器,但用的更多的是容器迭代器。容器迭代器用法和iterdemo.cpp一样,但和将迭代器申明为指针变量不同的是,你可以使用容器类方法来获取迭代器对象。两个典型的容器类方法是begin()和end()。它们在大多数容器中表示整个容器范围。其他一些容器还使用rbegin()和rend()方法提供反向迭代器,以按反向顺序指定对象范围。下面的程序创建了一个矢量容器(STL的和数组等价的对象),并使用迭代器在其中搜索。 1 //容器迭代器 2 #include 3 #include 4 #include 5 using namespace std; 6 7... 阅读全文
posted @ 2013-07-26 11:15 瓶哥 阅读(572) 评论(0) 推荐(0)
摘要:STL的堆操作STL里面的堆操作一般用到的只有4个:make_heap();、pop_heap();、push_heap();、sort_heap();他们的头文件函数是#include 首先是make_heap();函数原型是:void make_heap(first_pointer,end_pointer,compare_function);一个参数是数组或向量的头指针,第二个向量是尾指针。第三个参数是比较函数的名字。在缺省的时候,默认是大跟堆。(下面的参数都一样就不解释了)作用:把这一段的数组或向量做成一个堆的结构。范围是(first,last)然后是pop_heap();它的函数原型是 阅读全文
posted @ 2013-07-19 13:28 瓶哥 阅读(664) 评论(0) 推荐(0)
摘要:Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!1.map最基本的构造函数;mapmapstring; mapmapint; mapmapstring; mapmapchar; mapmapchar; mapmapint;2. map添加数据;map maplive; maplive.insert(pair(102,"aclive")); maplive.insert(map::value_type(321,"hai")); maplive[112]=" 阅读全文
posted @ 2013-07-16 14:09 瓶哥 阅读(227) 评论(0) 推荐(0)
摘要:C++ STL set和multiset的使用1,set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就 像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。 set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。创建 multiset base;删除:如果删除元素a,那么在定义的比较关系下和a相等的所有元素都会被删除base.count( a ):set能返回0或者1,multiset是有多少个返回多少个.Set和multiset都是引用头文件,复杂度都是logn2,Set中的元素可以是任意类型的 阅读全文
posted @ 2013-07-16 14:08 瓶哥 阅读(204) 评论(0) 推荐(0)
摘要:1.任何改变vector长度的操作都会使已经存在的迭代器失效vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 为了可以使用vector,必须在你的头文件中包含下面的代码: #include vector属于std命名域的,因此需要通过命名限定,如下完成你的代码: using std::vector; vector vInts; 或者连在一起,使用全名: std::vec... 阅读全文
posted @ 2013-07-13 16:50 瓶哥 阅读(326) 评论(0) 推荐(0)
摘要:相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用。但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯定的。也许有人会说,即使不用MFC框架,也可以想办法使用MFC中的API,具体的操作方法在本文最后给出操作方法。其实,可能很多人很可能会忽略掉标准C++中string类的使用。标准C++中提供的string类得功能也是非常强大的,一般都能满足我们开发项目时使用。现将具体用法的一部分罗列如下,只起一个抛砖引玉的作用吧,好了,废话少说,直接进入正题吧!要想使用标准C++中string类,必须要包含#i 阅读全文
posted @ 2013-07-12 15:48 瓶哥 阅读(195) 评论(0) 推荐(0)
摘要:http://blog.sina.com.cn/s/blog_51409e8f01009h7g.html前言: string 的角色1 string 使用1.1 充分使用string 操作符1.2 眼花缭乱的string find 函数1.3 string insert, replace, erase 2 string 和 C风格字符串3 string 和 Charactor Traits4 string 建议5 小结6 附录前言: string 的角色C++ 语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能 阅读全文
posted @ 2013-07-12 15:44 瓶哥 阅读(399) 评论(0) 推荐(1)
摘要:stringstream包括istringstream和ostringstream,提供读写string的功能,使用时需包含stream文件。4个操作:1. stringstream strm; 创建stringstream对象2. stringstream strm(s) ; s是string,复制构造函数3. strm.str() ; 返回strm中存储的string类型对象4. strm.str(s); 将string s复制给strm, 返回void功能:1.细化处理功能。如处理文件每行的同时处理每个单词,可用stringstream实现。string line, word;whil. 阅读全文
posted @ 2013-07-11 17:04 瓶哥 阅读(1521) 评论(0) 推荐(0)
摘要:1,set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。创建 multiset base;删除:如果删除元素a,那么在定义的比较关系下和a相等的所有元素都会被删除base.count( a ):set能返回0或者1,multiset是有多少个返回多少个.Set和multiset都是引用头文件,复杂度都是logn2,Set中的元素可以是任意类型的,但是由于需要排序,所以元素必须有一个序,即大小的 阅读全文
posted @ 2013-07-11 16:25 瓶哥 阅读(175) 评论(0) 推荐(0)
摘要:英文原文连接:http://lazyfoo.net/articles/article04/index.php废话我也就不翻译了,贴个代码然后注释一下吧。1.游戏住循环接收信息,然后操作,最后渲染1 while( gameIsRunning )2 {3 //Events4 //Logic5 //Rendering6 }2.游戏循环细节这里强调一个动作事件处理(event handling)和表面的属性逻辑(logic)分离开来,分开来处理。下面的程序先处理键盘事件,修改表面的属性;然后出了事件循环再根据属性的变化,落实操作,先渲染背景,再渲染前景刷新屏幕,程序必须限制帧率... 阅读全文
posted @ 2013-07-07 13:25 瓶哥 阅读(689) 评论(0) 推荐(0)
摘要:以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html有什么不对的欢迎指正!!!1.头文件 1 //testdll.h 2 #ifndef _TESTDLL_H_ 3 #define _TESTDLL_H_ 4 5 #ifdef TESTDLL_EXPORTS 6 #define TESTDLL_API __declspec(dllexport) //这个修饰符使得函数能都被DLL输出,所以他能被其他应用函数调用 7 #else 8 #... 阅读全文
posted @ 2013-06-26 17:46 瓶哥 阅读(703) 评论(0) 推荐(0)
摘要:以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html有什么不对的欢迎指正!!!1.头文件 1 //testdll.h 9 #ifndef _TESTDLL_H_10 #define _TESTDLL_H_11 12 namespace MathFuncs 13 { 14 // This class is exported from the testdll.dll 15 // Returns a + b 16 exte... 阅读全文
posted @ 2013-06-25 21:38 瓶哥 阅读(683) 评论(1) 推荐(1)
摘要:1.揭密extern "C"extern "C"包含双重含义,从字面上即可得到:首先,被它修饰的目标是 "extern”的;其次,被它修饰的目标是 "C”的。 首先来看一下 "extern”的含义: a.在一个文件内,如果外部变量不在文件的开头定义,其有效范围只限定在定义到文件的结束处。如果在定义前需要引用该变量,则要在引用之前用关键字 "extern” 对该变量做“外部变量声明”,表示该变量是一个已经定义的外部变量。有个这个声明,就可以从声明处起合理地使用该变量了。"extern”起到了扩展作用域的作用 阅读全文
posted @ 2013-06-25 19:23 瓶哥 阅读(1727) 评论(0) 推荐(0)
摘要:1.dll的优点代码复用是提高软件开发效率的重要途径。一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架,ATL、MFC等,它们都以源代码的形式发布。由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”。“白盒复用”的缺点比较多,总结起来有4点。 暴露了源代码;多份拷贝,造成存储浪费; 容易与程序员的“普通”代码发生命名冲突; 更新功能模块比较困难,不利于问题的模块化实现; 实际上,以上4点概括起来就是“暴露的源代码”造成“代码严重耦合”。为了弥补这些不足,就提出了“二进制级别”的代码复用。使 阅读全文
posted @ 2013-06-24 22:12 瓶哥 阅读(1126) 评论(0) 推荐(0)