C/C++
文章平均质量分 80
alex1997222
。。。。
展开
-
STL中优先队列的使用
优先队列底层是用堆来实现的,队首元素一定是当前队列中优先级最高的那个元素使用案例如下#include <iostream>#include <string>#include <queue>#include <vector>using namespace std;struct fruit{ string name; int p...原创 2019-01-17 14:41:13 · 191 阅读 · 0 评论 -
C++通过Read函数读取文件
通过read函数将文件中的数据按照一定的长度读取出来并且存放在新的数组中。函数原型istream& read (char* s, streamsize n); //用来暂存内容的数组(必须是char*型),以及流的长度比如我们要读取txt文件中的内容ifstream in("TEST.txt");先通过文件流将流与txt文件绑定,然后获取文件长度in.seekg(0, in.end)原创 2018-01-04 22:24:11 · 56510 阅读 · 5 评论 -
关联容器迭代器itr &(*itr)是什么意思
我们定义一个map容器以及它的迭代器itr std::map testMap; testMap.insert(make_pair("A", 1)); testMap.insert(make_pair("B", 2)); testMap.insert(make_pair("C", 3)); testMap.insert(make_pair("D", 4)); testMap.i原创 2017-12-26 22:28:21 · 2726 阅读 · 0 评论 -
Windows程序设计:位图的显示
在WIN32中,将位图显示在窗口上的步骤有一些复杂它不是将位图像线条一样直接画在窗口上的,而是通过内存句柄调用显示在窗口上的如果要在窗体上显示位图,首先要把位图调入资源视图中加载位图资源:将资源视图中的位图加载进来static HBITMAP hBitMap; //位图句柄static BITMAP BitMap; //位图结构体其中位图结构体原创 2017-12-18 12:11:46 · 2639 阅读 · 0 评论 -
C++可变参数的两种方法
在C++中,有的时候函数的参数个数无法确定,此时就会出现问题,如:将n个数进行相加int sum(int i1, int i2);int sum(int i1, int i2, int i3);...//还可以重载更多类似函数double sum(double d1, double d2);double sum(double d1, double d2, double d3);..转载 2017-11-26 21:52:08 · 34375 阅读 · 5 评论 -
C++ IO类(2) 流的缓冲
每个输出流都管理一个缓冲区:用来保存程序读写的数据,例如执行以下的操作:cout文本串可能被立即打印出来,也可能被操作系统保存在缓冲区中,随后再打印,有了缓冲机制,操作系统就可以将程序的多个输出操作合成单一的系统级写操作管理缓冲区:缓冲区满时,需要刷新缓存,而后才能写入缓冲区endl刷新缓冲区操作符unitbuf设置流内部状态,来清空缓冲区(cerr立即清空)默原创 2017-11-23 23:39:47 · 254 阅读 · 0 评论 -
C++ IO类(1) 流的介绍和流的状态
基本IO库类型:istream(输入流)类型, 提供输入操作ostream(输出流)类型,提供输出操作cin, 一个istream对象,从标准输入读取数据cout, 一个ostream对象,向标准输出写数据cerr,一个ostream对象,通常用于输出程序错误信息,写入到标准错误>>: 用来从一个istream对象读取输入数据getline:从一个给定的istrea原创 2017-11-23 23:03:01 · 1197 阅读 · 0 评论 -
C++ extern(2) C++与C的混用
在实际开发中,经常会遇到C++与C混用的情况,具体方法如下C1.c文件是用C编写的C文件:#include //使用C编写int i = 1;void func(){ printf("%d", ++i);}CPP1.cpp文件是用c++编写的C++文件#includeusing namespace std;//使用C++编写// extern转载 2017-12-03 23:46:06 · 288 阅读 · 0 评论 -
C++ extern(1) extern的用处
extern是一个关键字,它告诉编译器存在着一个变量或函数,如果没有找到相应的变量或函数,会在当前的文件或文件后面定义先看这么一个例子:#includeusing namespace std;int main() { i = 0; func(); system("PAUSE"); return 0;}int i;void func() { i++; cou转载 2017-12-03 23:25:51 · 232 阅读 · 0 评论 -
模拟游戏引擎中的灯光实现
游戏中的光的种类有三种:环境光,平行光,点源光灯光种类的实现使用了枚举表示,灯光定义的结构体把所有的灯光属性都集合在一起,根据不同的灯光属性,填充不同的参数.结构体表示如下:struct ELight { EInt id; //灯光的ID,全局唯一 EBool lightOn; //设置灯光开 默认开启 LIGHT_TYPE lightType; /原创 2017-12-03 22:20:33 · 721 阅读 · 0 评论 -
(复健计划)标准库类型string
标准库类型string表示可变长的字符序列,使用string类型必须包含sring头文件<string>。作为标准库的一部分,string定义在命名空间,string定义在命名空间std中 示范如下:#include<string>using std::string初始化法则如下:string s5 = "hello";string s6("hello"...原创 2018-07-18 22:58:36 · 109 阅读 · 0 评论 -
C++内存中的堆和栈
我们把一个C++程序在运行的时候所占据的内存空间,分成四个部分栈区 堆区全局区/静态区常量区在C++程序的内存空间中,我们在代码中声明的局部变量,以及函数的形式参数,都保存在栈区中,这部分内存在程序运行的时候会自动分配,而在不需要的时候也会自动释放,并不需要去手动维护而我们使用new或者malloc函数进行动态内存分配后,系统为我们划分的内存空间,就来自于堆区,因为程序自己...原创 2018-07-29 14:27:59 · 830 阅读 · 0 评论 -
C++Lambda表达式
Lambda表达式的完整声明格式如下:[capture list] (params list) mutable exception-> return type { function body }mutable指示符用来说明是否可以修改形参变量,exception表示异常设定一个例子如下:[capture list] (params list) -> return t...原创 2018-07-22 14:18:10 · 1623 阅读 · 0 评论 -
C语言文件权限/数学函数总结
C语言文件权限/数学函数总结文件权限函数整体概述access():判断是否具有存取文件的权限alphasort():依字母顺序排序目录结构chdir():改变当前的工作目录chmod():修改文件权限chown():改变文件所有者chroot():改变文件根目录closedir():关闭目录fchdir():改变当前工作目录fchmod():修改文件的权限fchown():改...转载 2018-11-11 20:25:48 · 1361 阅读 · 0 评论 -
二进制数的源码,反码,补码
(1)原码 符号位用0表示正数,用1表示负数(用八位表示)+57原码= 00111001 -57原码=10111001+0原码 = 00000000 -0原码=10000000(2)反码:正数的反码就是原码,负数的反码除符号位不变,其余按位求反+57反码= 00111001 -57反码=11000110(3)补码:正数的补码就是原码,负...原创 2018-09-19 12:05:10 · 3773 阅读 · 4 评论 -
进制计算与转换
(一) (二、八、十六进制) → (十进制)(Figure2:其他进制转换为十进制)二进制 → 十进制 方法:二进制数从低位到高位(即从右往左)计算,第0位的权值是2的0次方,第1位的权值是2的1次方,第2位的权值是2的2次方,依次递增下去,把最后的结果相加的值就是十进制的值了。 例:将二进制的(101011)B转换为十进制的步骤如下:1. 第0位 1 x 2^0 = 1...转载 2018-09-19 11:17:51 · 4340 阅读 · 1 评论 -
仿函数初步
仿函数类似于以类为基础的函数,比如下面这个例子class Pow {public: double operator()(double x, int y) { return pow(x, y); }};我们可以通过类名直接调用这个仿函数有的时候仿函数会起到奇效,比如给vector容器中的元素进行排序class compareVec {public: compare...原创 2018-08-26 21:26:06 · 152 阅读 · 0 评论 -
智能指针
在C++中,如果指针使用不当,比如没有及时释放指针所指向的内存,或者野指针等,会造成系统发生不可预估的错误,为了防止这一情况的发生,C++ STL提供了一系列智能指针类型智能指针简单来说就是系统会帮助我们进行管理,并及时释放占用的内存,简单结构如下template<class T>class Smart_Pointer {private: T *_ptr;pub...原创 2018-08-08 15:12:27 · 136 阅读 · 0 评论 -
各类常见指针
空指针空指针是一类可以指向任何数据类型的指针类型,定义方式为 void* 变量名int a = 10;char b = 'A';float c = 12.432;void *pA = &a;void *pB = &b;void *pC = &c;怎样把空指针类型强制转换成其他非指针类型? 一开始我想到了这样去做:int a1 = static...原创 2018-08-08 14:50:44 · 637 阅读 · 0 评论 -
C++异常处理
C++的异常处理分为抛出异常和处理异常两部分,抛出异常只需要throw<异常表达式>就行,这么一个语句。这个语句会运行异常表达式,然后把结果保存到某个地方,最后结束整个函数的执行。外层函数也会被挨个结束,直到落到了某一个try语句里面为止try{ // 这里放着一段可能会抛出异常的代码,并且你想要处理它。 f();}catch(int e){ ...原创 2018-08-02 15:57:28 · 163 阅读 · 0 评论 -
(实践中遇到的坑)对map中的键值对根据值排序
map不提供sort功能,sort算法对map容器也不适用,这个时候,我们可以建立一个vector来暂存键值对,排序完毕后,再返回即可typedef pair<string, float> pii;vector<pii> finalResult;multimap<string, float> transcript; //假设内部已有数据//先将...原创 2018-07-31 21:16:38 · 507 阅读 · 0 评论 -
利用multimap实现一键对多值
C++ 中map容器实现了键值对功能(类似于C++中的字典操作) 但是如果我们想要一键对多值该怎么办呢这时候可以用multimap容器比如我们要建立一个成绩单,里面有学生和成绩,而且一个学生可以有多个成绩,这时候该怎么办呢multimap<string, float> transcript; //string保存姓名,float保存成绩在这个容器中,可以有多个相同的...原创 2018-07-31 21:06:04 · 2330 阅读 · 0 评论 -
操作符重载(类里面和类外面)
struct X{ X operator -() { return{}; } X operator-(const X&) { return{}; }};X operator* (const X &x1, const X &x2){ return {};}在这里例子中,如果把操作符重载定义在类里面,类自己this也会作为参数参...原创 2018-08-04 21:15:03 · 3422 阅读 · 0 评论 -
C++ lambda表达式的几个例子
统计一个vector中奇偶数的个数:lambda做法:这样就避免了再多定义统计函数,简洁了不少template<typename U> //要使用模板,因为返回值可能会多样int Counter(vector<int>& numberVec, U filter) { int count = 0; for (auto& x : numbe...原创 2018-07-22 14:41:31 · 1014 阅读 · 0 评论 -
C++ 模板(3) 模板的特化
C++中,模板的特化可以实现对不同的数据类型进行不同的处理:比如我们要对int类型的数据用快速排序法进行排序对float类型的数据用插入排序法进行排序templatevoid sort(T arg[], int size) { cout << "temp speclized use" << endl;}template<> //特化void sort(int arg[]转载 2017-12-02 23:46:26 · 289 阅读 · 0 评论 -
C++ 模板(2) 静态变量
每种不同类型的模板函数,其静态变量不共享例子如下:templatevoid useOfStatic(const T& A) { static int i = 0; cout << ++i << endl;}int main() { useOfStatic(10); useOfStatic(20); useOfStatic(2.5); system("PAUSE转载 2017-12-02 22:55:10 · 1166 阅读 · 0 评论 -
C++ 模板(1) 介绍与使用方法
工模板是C++语言中很强大的一个工具,它允许将一个数据类型作为参数进行传递,这样不需要为相同的数据类型写相同的代码例如,对不同类型的数据进行排序。与其编写多份重复的代码,不会只写一个sort函数,并将数据类型当作参数传递。C++使用两个关键字来支持模板:templatetemplate一个具体的使用例子:#includeusing namespace std;tem转载 2017-12-02 22:21:45 · 285 阅读 · 0 评论 -
c++ 通过移动指针改变数组中的每一个值
在函数中传入一个数组作为参数 可以通过设置一个指针作为形参void func(int *p, int len) {p可以是数组然后通过移动指针的地址 来修改数组中的每一个值void func(int *p, int len) { for (int i = 0; i < len; i++) { *(p+i) = p[i] + 1; } return;}指针原创 2017-10-14 23:06:59 · 5407 阅读 · 0 评论 -
C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
在C++的类定义里面,可以看到类似下面的定义:01class List {02private:03 Node * p_head;04 int length;转载 2017-10-19 23:44:11 · 1169 阅读 · 0 评论 -
STL QUEUE
一.queue模版类的定义在头文件中。queue与stack模版非常类似,queue模版也需要定义两个模版参数,一个是元素类型,一个是容器类型,元素类型是必要的,容器类型是可选的,默认为dqueue类型。定义queue对象的示例代码如下:queueq1;queueq2;queue的基本操作有:1.入队:如q.push(x):将x元素接到队列的末端;转载 2017-10-08 17:22:29 · 186 阅读 · 0 评论 -
STL STACK
栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表。栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往上堆。取走时,只能从上面一件一件取。读和取都在顶部进行,底部一般是不动的。栈就是一种类似桶堆积物品的数据结构,进行原创 2017-10-07 16:40:43 · 166 阅读 · 0 评论 -
C++ 重载 重写与重定义
重载:函数名相同 参数列表不一致 重载只是在类的内部存在重写:也叫做覆盖 子类重新定义父类中有相同名称和参数的虚函数。函数特征相同,但具体实现不同,主要是继承关系中出现的(1)函数必须是虚函数virtual 不能是static函数(2)重写函数必须有相同类型,名称和参数列表(3)重写函数的访问修饰符可以不同重定义也叫隐藏,子类重新定义父类中有相同名称的非虚函数例转载 2017-09-26 08:25:41 · 484 阅读 · 0 评论 -
c++ 头文件
头文件模板 C++防卫式声明为了防止头文件在cpp文件中被重复include模板:#ifndef __MYCOMPLEX__ //__头文件名__#define __MYCOMPLEX__//代码部分#endif //结束原创 2017-09-08 23:25:10 · 184 阅读 · 0 评论 -
C++指针与引用
修改指针的值:把一个指针赋值给另一个指针,只修改值,不修改地址如以下函数:void Func2(myUtil* pMyClass ,myUtil* newPMyClass) { int data = pMyClass->data; cout << data << endl; /*pMyClass = newPMyClass;*/ //此时只修改了new原创 2017-09-14 16:19:21 · 204 阅读 · 0 评论 -
C++ 操作符重载(1) 时间相加
重载操作符的目的:的 C++中预定义的运算符的操作对象仅限于基本的内置数据类型 大多时候我们需要对我们的类似类型进行类似运算,这个时候我们需要对运算符进行重新定义,赋予其新内容 赋予其新的功能,以满足自身的需求 运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的C++多态。目的在于让人能够用同名的函数来完成不同的基本操作。 基本格式如下: operator转载 2017-11-17 22:08:28 · 2849 阅读 · 0 评论 -
C++ 重载实例:复数的运算操作
因为涉及到输入流和输出流的重载,这里先介绍一下输入流和输出流的重载方法:struct Vector{ int x; int y;};我们要在输出流中直接输出类,比如(1,2),(3,4),那么我们该怎么做呢这个时候我们要重载输出流:ostream& operator<<(ostream& o, Vector v){ return o &...原创 2017-11-18 22:19:48 · 2662 阅读 · 0 评论 -
C++ STL容器之map操作
Map是STL的一个关联容器,它提供一对一的数据处理能力其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可以称为关键字的值map可以看作是一棵有序的红黑树,这棵树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的map mapStudent;这里mapStudent有两个属性,int可表示为学生的学号,string可表示学生的姓名数据的插入转载 2017-12-18 20:32:57 · 289 阅读 · 0 评论 -
C++ NAMESPACE
namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都可能使用相同的名字来实现不同的库,于是程序员在合并程序的时候就会可能出现名字的冲突。namespace引入了复杂性,解决了这个问题。namespace允许像类,对象,函数聚集在一个名字下。本质上讲namespace原创 2017-11-21 23:41:07 · 340 阅读 · 0 评论 -
自增和自减的坑
C++中, 前缀式自增(或自减)可以用来当做左值使用,但是后缀式自增(或自减)不能被当做左值使用。例子如下:#include using namespace std;int main() { int a = 0; ++a = 20; //编译正确 a++ = 30; //编译出错 return 0;}原创 2017-11-20 11:15:04 · 523 阅读 · 0 评论 -
C++运算符重载(8) - 默认赋值操作符和引用
在前面我们提到过:当没有用户定义赋值操作符时,编译器会默认生成一个进行浅型拷贝如指针不但会赋给指向的值,还会赋给地址,这回产生问题这个问题对引用而言,适不适用呢?#include using namespace std;class myTestTwo {private: int value; int &ref = value; //创建value的引用public:转载 2017-11-20 11:06:52 · 266 阅读 · 0 评论