
C/C++
啊啊啊西吧
写点什么呢
展开
-
c++程序编译过程
编译主要分为4个过程: 预处理-编译优化-汇编-链接 1) 编译预处理 预编译程序完成的工作,可以说成是对源程序的“替换”工作。经过这个过程,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。 宏定义命令;例如#define 条件编译指令;例如#ifdef 头文件包含指令;例如#include 特殊符号;例如__LINE__,__FILE__ 预处理模块;例如#pragm转载 2017-08-07 11:02:24 · 619 阅读 · 0 评论 -
并查集算法(union-find)
就动态连通性这个场景而言,我们需要解决的问题可能是: 给出两个节点,判断它们是否连通,如果连通,不需要给出具体的路径 给出两个节点,判断它们是否连通,如果连通,需要给出具体的路径就上面两种问题而言,虽然只有是否能够给出具体路径的区别,但是这个区别导致了选择算法的不同,本文主要介绍的是第一种情况,即不需要给出具体路径的Union-Find算法,而第二种情况可以使用基于DFS的算法。 题目1:畅通原创 2017-04-27 17:06:32 · 918 阅读 · 0 评论 -
STL:set详解
和vector、list不同,set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。 删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置,并没有改变,所以删除一个节点后其他迭代器不会失效。list和map也是同样的道理。 然而删除vector中的某个元素,vec原创 2017-05-09 10:14:21 · 582 阅读 · 0 评论 -
c++类型转换
c++有两种强制转换:1、命名的强制转换 2、旧式的强制类型转换1、命名的强制转换 形式:cast-name(expression); type是要转换成的目标类型,expression是要转换的值 cast-name关键字有:static_cast, reinterpret_cast,const_cast,dynamic_cast cast-name指定了执行的是哪种转换。stati转载 2017-05-27 11:08:15 · 294 阅读 · 0 评论 -
c++拷贝构造函数详解
一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。 下面看一个类对象拷贝的简单例子。#include <iostream> using namespace std; class CExample { private:转载 2017-05-26 22:10:30 · 297 阅读 · 0 评论 -
c语言:strtok()函数
函数原型:char * strtok ( char * str, const char * delimiters );参数列表:strC string to truncate.Notice that this string is modified by being broken into smaller strings (tokens).Alternativelly, a null point转载 2017-05-26 09:55:57 · 1657 阅读 · 2 评论 -
由to_string函数学习sprintf()及sscanf()函数的用法
今天看到VS里面的to_string()函数的实现,下面以int型参数的to_string为例介绍:inline string to_string(int _Val) { // convert int to string char _Buf[2 * _MAX_INT_DIG]; _CSTD _TOSTRING(_Buf, "%d", _Val); return (s原创 2017-05-25 22:43:11 · 1343 阅读 · 0 评论 -
常用排序算法的c++实现
闲来没事手打了一遍几种排序算法,分享以供大家参考:#include<iostream>using namespace std;//交换数组中2个元素的值void swap(int &a, int &b){ int tmp = a; a = b; b = tmp;}//冒泡排序最简单的暴力解法void bubble_sort(int a[], int n){原创 2017-05-25 21:56:57 · 319 阅读 · 0 评论 -
c++成员变量的初始化顺序
class A{private: int n1; int n2;public: A():n2(0),n1(n2+2){} void Print(){ cout << "n1:" << n1 << ", n2: " << n2 <<endl; }};int main(){ A a; a.Print(); return转载 2017-05-25 21:17:13 · 450 阅读 · 0 评论 -
N皇后问题的c++解法
N皇后问题: 国际象棋中皇后的势力范围覆盖其所在的行、列以及两条对角线,现在考察如下问题:如何在n x n的棋盘上放置n个皇后,使得她们彼此互不攻击 对于任何整数:n>=4,这就是n皇后问题。我们常说的8皇后问题也就是n为8的时候 首先,讲一讲思路,大致思路就是:我们把n个皇后分别放在n行中的第一个位置,然后挨行试探,回溯 譬如,第一个皇后在第一行第一列,试探下一行的皇后,将其放在不会与之前原创 2017-05-05 13:04:33 · 17345 阅读 · 0 评论 -
C++虚继承与继承
虚继承 1、why用虚继承? 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。 class 派生类名:virtual 继承方式 基类名 virtual是关键字,声明该基类为派生类转载 2017-06-16 16:13:37 · 368 阅读 · 0 评论 -
设计模式:工厂模式
在面向对象系统设计中经常可以遇到以下的两类问题: ◆ 1.为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。这里很容易出现的一个问题 n 多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就编写诸如 new ×××;的代码。 这里带来两个问题:转载 2017-06-02 11:07:42 · 404 阅读 · 0 评论 -
c++11:static_assert 与assert
assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。assert分为动态断言和静态断言2种。c++0x引入了static_assert关键字,用来实现编译期间的断言,叫静态断言。 语法:static_assert(常量表达式,要提示的字符串); 如果第一个参数常量表达式的值为false原创 2017-08-04 17:20:35 · 19671 阅读 · 1 评论 -
python3脚本使用sql loader批量导入字节文件并二次处理
由于使用cx_oracle连接oracle然后导入数据文件速度太慢(要导的数据有几百G),出于速度的考虑,选择了oracle自带的sql loader工具,使用python脚本写界面,与用户交互,然后使用system()去批量调用sql loader,对于导入失败的bad数据以及日志数据,我用了c++写了一个程序,把bad文件转换成了ok的数据,然后又写了一个脚本处理这些bad数据。 1、pyth原创 2017-07-03 14:46:55 · 6387 阅读 · 0 评论 -
c++构造函数的初始化列表
与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。 例如:struct foo{ string name ; int id ; foo(string s, int i):name(s), id(i){} ; // 初始化列表};初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数转载 2017-06-30 17:25:00 · 1825 阅读 · 0 评论 -
c++:尽量用new/delete代替malloc/free
在C语言中,我们已经熟悉利用malloc/free来管理动态内存,而在C++中,我们又有了新的工具:new/delete。你不禁会产生疑问—有了malloc/free为什么还要new/delete 呢?使用malloc/free和使用new/delete又有什么区别呢?首先来分析一下下面的代码片段:class Object{public:Object() {cout << "Hello,转载 2017-06-19 19:19:30 · 3985 阅读 · 0 评论 -
overload与override
先说overload,重载: 成员函数被重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual关键字可有可无。再说重写,override: 重写是指派生类函数重写基类函数,是C++的多态的表现,特征是: (1)不同的范围(分别位于派生类与基类); (2)函数名字相同; (3)参数相同; (4)基类函数必须有virtual关键原创 2017-06-19 19:01:06 · 462 阅读 · 0 评论 -
设计模式:单例模式
单例模式: 个人认为单例模式是设计模式中最为简单、最为常见、最容易实现,也是最应该熟悉和掌握的模式。且不说公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是单例模式。单例模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如 C++中)中,我们也还是可以通过一个全局变量实现这一转载 2017-06-07 20:05:58 · 282 阅读 · 0 评论 -
c++浅拷贝与深拷贝
什么是拷贝构造函数? 首先,关于c++拷贝构造函数:拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量。 对于一个类X, 如果一个构造函数的第一个参数是下列之一: a) X& b) const X& c) volatile X& d) const volatile X&且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构原创 2017-06-19 18:28:21 · 304 阅读 · 0 评论 -
c/c++程序的内存布局
程序代码段: 代码段是用来存放可执行文件的操作指令,它是可执行程序在内存中的映像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作——它是不可写的。程序数据段: 存放可执行文件中已经初始化的全局变量,静态变量 BSS段: 包含了程序中未初始化的全局变量,在内存中全部置零 堆: 堆是用于存放进程运行中被动态分配的内存段,它大小并不固定,可动态扩张或缩减。当进程转载 2017-06-19 12:57:40 · 645 阅读 · 0 评论 -
设计模式六大原则
所谓无招胜有招,练一门功夫分为内功和外功。外功好比招式,就是所谓的23种设计模式。而内功呢,就是心法,那就是这6种法则。光会外功那是花拳绣腿,内功修为才是境界。如此众多的设计模式,学完2遍,3遍可能也会忘的只记得单例和工厂模式。但是只要原则记住,在以后的设计中,有意无意就会用的设计模式的精髓。单一职责原则 不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 问题由来:类T负责转载 2017-06-02 18:29:54 · 328 阅读 · 0 评论 -
stl:stack详解
今天写八皇后的算法,采用试探回溯法使用到了c++的stack,然后牵扯出一些毛病让我加深了对c++标准库的stack的理解,我甚至觉得stl 的stack实现的非常简陋,很多不便之处,下面具体分析。 首先贴上vs2013下面的stack源码,跟stl一样,stack默认都是基于deque实现的,所以代码看上去相对其他的数据结构比较简洁,下面贴出主要的源码:template<class _Ty,原创 2017-05-04 22:48:46 · 2874 阅读 · 1 评论 -
c++类的访问控制与继承
对于类的成员,访问权限所控制的是类的实例对象对类中的成员的访问能力;而继承关系中访问权限所控制的是子类对于父类的数据成员的访问与使用能力。 private,public,protected方法的访问范围.(public继承下) private: 只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问. 被private修饰的成员只能被同一个类中的成员函数或在该类中声明的原创 2017-04-20 10:55:32 · 701 阅读 · 0 评论 -
windows多线程:Interlocked系列函数
在多线程环境中对一个变量进行读写时,我们需要有一种方法能够保证对一个值的递增等等操作是原子操作——即不可打断性,一个线程在执行原子操作时,其它线程必须等待它完成之后才能开始执行该原子操作。这种涉及到硬件的操作会不会很复杂了,幸运的是,Windows系统为我们提供了一些以Interlocked开头的函数来完成这一任务(下文将这些函数称为Interlocked系列函数)。下面列出一些常用的Interlo转载 2017-03-15 16:26:42 · 437 阅读 · 0 评论 -
gcc与g++
我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++,或者说编译用gcc,链接用g++,一时也不知哪个说法正确,如果再遇上个extern “C”,分歧就更多了,这里我想作个了结,毕竟知识的目的是令人更清醒,而不是更糊涂。 误区一:gcc只能编译c代码,g++只能编译c++代码.两者都可以,但是请注意:1.后缀为.c的,gcc把它当作转载 2016-06-15 21:33:29 · 397 阅读 · 0 评论 -
c++常量引用
使用引用而非常量引用极大的限制了函数所能接受的实参的类型.因为我们不能把const对象字面值或者需要类型转换的对象传递给普通的引用形参.1、这种错误绝不像看起来这么简单,它可能造成出人意料的结果.例如我们定义函数声明:string::size_type find_char(string &s,char c,string::size_type &occurs);则只能将find_char函数作用于st转载 2016-11-16 16:32:28 · 2139 阅读 · 0 评论 -
浅析c、c++,vc++
首先看下c与c++的异同: (1)C++与C语言相比有何特点 全面兼容C语言;支持面向对象编程;C++的可重用性、可扩充性以及可维护性较好。 (2)C++与C语言程序结构有何不同 C语言的程序结构主要包括预处理程序、自定义类型说明、常量定义、函数定义以及主函数定义几大部分; C语言的程序结构在C++中也是适用的,此外C++还有类的定义和使用两个主要组成部分。 (3)C++与C语言如何处理转载 2016-09-08 16:22:59 · 815 阅读 · 0 评论 -
c语言中typedef的几种用法
几种用法:1.常规变量类型定义例如:typedef unsigned char uchar 描述:uchar等价于unsigned char类型定义 uchar c声明等于unsigned char c声明2.数组类型定义 例如: typedef int array[2]; 描述: array等价于 int [2]定义; array a声明等价于int a[2]声明扩展: typedef in转载 2016-07-07 09:41:57 · 23796 阅读 · 2 评论 -
创建内存流:fmemopen()函数详解
创建内存流的3个函数如下:#include <stdio.h>FILE* fmemopen(void*buf, size_t size, const char* mode);FILE* open_memstream(char**ptr, size_t* sizeloc);#include <wchar.h>FILE* open_wmemstream(wchar_t** ptr, size_t*原创 2016-07-14 21:12:55 · 9024 阅读 · 0 评论 -
递归实现二进制转换
/* binary.c -- prints integer in binary form */#include <stdio.h>void to_binary(unsigned long n);int main(void){ unsigned long number; printf("Enter an integer (q to quit):\n"); while (s原创 2016-06-24 10:02:38 · 778 阅读 · 0 评论 -
extern "c"用法解析
C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。 extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数转载 2016-06-15 21:55:49 · 574 阅读 · 0 评论 -
c链表(创建、显示、释放)
代码如下:#define _CRT_SECURE_NO_WARNINGS/* binary.c -- prints integer in binary form *//* films2.c -- using a linked list of structures */#include <stdio.h>#include <stdlib.h> /* has the malloc p原创 2016-06-24 09:40:10 · 4250 阅读 · 0 评论 -
用g++编译c++文件
一、GCC(GNU Compiler Collection)是linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活。它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada g++是GCC中的一个工具,专门来编译C++语言的。 GCC的参数有:( 也是分步实现)转载 2016-12-19 14:58:22 · 3196 阅读 · 0 评论 -
select、poll、epoll总结
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户转载 2016-11-04 08:42:39 · 1031 阅读 · 0 评论 -
windows多线程之CreateThread与_beginthreadex的区别
使用多线程其实是非常容易的,下面这个程序的主线程会创建了一个子线程并等待其运行完毕,子线程就输出它的线程ID号然后输出一句经典名言——Hello World。整个程序的代码非常简短,只有区区几行。#include <stdio.h>#include <windows.h>//子线程函数DWORD WINAPI ThreadFun(LPVOID pM){ printf("子线程的线程I转载 2017-03-15 16:02:29 · 750 阅读 · 0 评论 -
希尔排序(shell sort):c++
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排转载 2017-03-13 13:05:34 · 2375 阅读 · 0 评论 -
快速排序(c++)
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。虽然快速排序称为分治法,但分治法这三个字显然无法很好的概转载 2017-03-11 17:18:31 · 321 阅读 · 0 评论 -
选择排序(c++)
直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。设数组为a[0…n-1]。初始时,数组全为无序区为a[0..n-1]。令i=0在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。交换之后a[0…i]就形成了一个有序区。i++转载 2017-03-11 16:07:24 · 347 阅读 · 0 评论 -
归并排序(c++)
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就放在新数组后面。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。//将有序数组a[]和b[]合并到c[]中void MemeryArray(int转载 2017-03-11 15:35:21 · 1243 阅读 · 0 评论 -
直接插入排序的三种实现(c++)
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。设数组为a[0…n-1]。初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。i++并重复第二步直到i==n-1。排序完成。第一种:void转载 2017-03-11 14:52:28 · 841 阅读 · 0 评论