C/C++
文章平均质量分 91
静革 justme0.com
这个作者很懒,什么都没留下…
展开
-
C 语言中模拟“泛型”
一般在写 C 程序时用 typedef 将容器中元素的类型抽象,无法在同一个程序中用到两种类型,而本文试图在一个程序中用到两种不同类型的容器,比如实现类似于 C++ 中的 vector 和 vector。核心技术是将元素类型定义为 void *,管它什么类型,都用 void * 类型的指针指向真正的数据,与此同时,类型的大小是个重要信息,比如一般地,char 为1个字节,double 为4个字节。原创 2014-02-07 22:44:15 · 3732 阅读 · 0 评论 -
数组传参的三种方法:泛型;压扁数组;数组结构
数组传参很常见,在C/C++中传递数组时,数组名会退化为指针,所以一般都要给出首地址和长度。这是有缺陷的,当我们在写函数时不知道各维大小时该怎么办呢?下面用矩阵乘法作为例子,给出三种实现方法:GP, flattening the array, struct其中我认为flattening the array 这种方法最好,OpenGL中的glMaplf 函数用的正是这种方法,它的函数原型如下原创 2013-01-10 17:34:09 · 2422 阅读 · 0 评论 -
继承实例(进制转换)
定义一个任意进制的数Number类,继承自string类:Number类的数据成员:_radix表示数的基数,_inum表示数的相应的十进制数用string存储任意进制的数(可以说是用字符串来存,r进制的数不适合用int来存)/*Number类的数据成员:_radix表示数的基数,_inum表示数的相应的十进制数*/// more: http://msdn.micro原创 2012-07-01 01:38:11 · 1682 阅读 · 0 评论 -
C 语言中实现数据与方法的封装
在 C 语言中可以用结构体代替类,用函数指针代替成员方法,实现数据成员与成员方法的封装,在客户端程序中写出的程序与 C++ 类似,唯一的不同是 C 语言中调用函数指针成员时必须将本对象的地址传给函数,因为 C 语言中各函数的地位是相同的。 本文以模仿 STL 中的 vector 类写了一个 C 语言的 vector 结构体,程序如下:1. vector 的接口/******原创 2013-08-19 00:25:58 · 3486 阅读 · 0 评论 -
第一次面试
下午课刚上完,我收到了HR的通知,得知没有通过面试,这是一家在合肥的软件公司。挺不爽的,我觉得主要是因为经验少。还是谈谈面试官问我的两个技术问题吧,我应聘的是C++软件开发工程师。1、STL中的map是线程安全的吗?我的回答:标准中没有规定,但是基本上STL都实现了,是线程安全的。其实是大部分版本的STL都不是线程安全的。我前几天刚好查了这个问题,参见:http://sta原创 2013-05-24 17:46:48 · 2805 阅读 · 7 评论 -
一个C#风格的C++程序
地址:http://blog.csdn.net/justme0/article/details/7994133 写C#程序就是在设计一个类!先看一个C#程序(表达式求值):using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleAppl原创 2012-09-19 01:30:18 · 9824 阅读 · 46 评论 -
学习C++的困惑
这个学期在学C++,我喜欢思考“内存”方面的事,而想来想去又想不通,思而不学则殆啊,也不知道我所想的各种古里古怪的细节问题是不是在编译原理那本书里。1、指针p+1时它知道是移动几个字节,它为什么会知道呢?于是我想指针变量存放的不仅有地址,还应该有指向的类型的大小方面的信息。int a;int *p =&a;p + 1 时它知道是移4个字节,这个信息放在哪里? 20原创 2012-03-24 15:36:35 · 2982 阅读 · 18 评论 -
用 C++ 标准模板库(STL)的 vector 实现二叉搜索树(BST)
本文由 Justme0 翻译自 Code Project 转载请参见文章末尾处的要求。介绍众所周知,要建一棵树,我们需要关注它的内存分配与释放。为了避开这个问题,我打算用C++ STL(vector和deque)来建一棵小型的BST。很明显,这篇文章是出于这个想法的。 背景BST是应用最广泛的数据结构之一。C是首选语言,不过因为C++尤其是C++11的出现,我更有兴翻译 2013-09-05 17:31:07 · 7191 阅读 · 2 评论 -
【算法】插入排序 insertion_sort
准备写个《STL 源码剖析》的读书笔记,开个专栏,名为《STL 的实现》,将源码整理一遍。很喜欢侯捷先生写在封底的八个字:天下大事,必作于细!他在书中写到:我开玩笑地对朋友说,这本书出版,给大学课程中的「数据结构」和「算法」两门授课老师出了个难题。几乎所有可能的作业题目(复杂度证明题除外),本书都有了详尽的解答。然而,如果学生能够从庞大的SGISTL源码中干净抽出某一部份,加上自己的包装,做为呈堂作业,也足以证明你有资格获得学分和高分。事实上,追踪一流作品并于其中吸取养份,远比自己关起门来写个三流作品,价原创 2014-04-22 17:20:19 · 3294 阅读 · 1 评论 -
求二叉树高度(更新:用C++14编写)
因为树是递归定义的,所以用递归算法很方便。#define _CRT_SECURE_NO_WARNINGS#include #include using namespace std;struct Node { char data; Node *lchild; Node *rchild;};void High(Node *T, int &h){ if (T == NULL原创 2012-06-27 00:29:22 · 15326 阅读 · 8 评论 -
函数式编程与 C++
这个学期学了一门函数式语言 Coq,是法国人发明的,它与 ML 很像,其实 Coq 的发明主要是受了 ML 的影响。Coq 的语法我就不在这叙述了,有兴趣的朋友可以看这本书 Software Foundations,也就是我们上课用的教材。下面直接看些例子吧。1. map它的功能与 C++ 中的std::transform算法类似,是将f作用在list中的每个元素(元素类型是X)上,返回一个list原创 2015-04-22 12:34:32 · 3410 阅读 · 1 评论 -
C/C++ 中生成特定范围内的随机数
大家在写 C/C++ 程序时,难免会遇到要求获取某个范围内的随机数,我查阅了一些资料后,总结如下。本文分两部分,先介绍 C 语言中与随机数相关的两个函数 srand 和 rand,后介绍 C++ 中的 random 库,每一部分最后会给出生成特定范围内的随机数模板供参考。1 C 语言中的 srand 和 rand1.1 实现下面是 VC 的实现,GCC 的实现比 VC原创 2014-11-27 16:04:02 · 27196 阅读 · 1 评论 -
用二级指针操作不带头结点的单链表
在不带头结点的单链表中删除特定元素,一种很麻烦的情况是首结点即要删的结点,所以往往标识一个链表的 head 就会改变,而在删除函数中要改变客户端的 head,就必须传入 head 的地址,否则客户端的 head 永远不会改变,也就是说,若形参为 Node * 类型,修改的只是 head 的副本,这是C语言中的基础问题。这篇博客是我读了皓哥的这篇文章《Linus:利用二级指针删除单向链表》有感而写的原创 2013-10-06 00:56:32 · 3316 阅读 · 8 评论 -
【库函数源码剖析系列】(1) strcpy
前言:学C语言的时候,我就想把C语言的库函数的函数体找出来,如果知道了函数的定义(*.h里只是一个函数原型),那么老谭那本书上有的语法就不用讲了,自己还能深入理解!于是,我准备开这个系列,把自己搜集的库函数定义记下来,唯一的要求是与微软实现的库函数功能一致,无任何bug。每篇之后,如果自己有什么看法会写在后面,各位有何高见也欢迎评论。我发现,源码中的函数体里大多只需用三个东西:指针,if语句,wh原创 2012-09-24 01:48:01 · 2359 阅读 · 8 评论 -
C++ 中的 Lambda 表达式
前些天买了本《程序设计语言理论》,看了简介,Lambda 演算贯穿整个理论,尤其在函数式语言中具有重要作用。C++11 中也加入了 Lambda 表达式,下面做个总结。1、一个简单的 Lambda 表达式如下:[] {}这就定义了一个对象,这个对象匿名,记住,Lambda 表达式是对象,不是类型,这很重要!本例中,该对象的类型是 'anonymous-namespace'::<lambda0>,这是编译器给它设的一个类型名。原创 2014-05-08 16:52:36 · 2570 阅读 · 0 评论 -
【算法】中位数 median
median 是 STL 内部的算法,用于求三个数的中位数,它将用于 std::sort, std::nth_element 的实现中,快速排序和求第 k 小数算法都用到了划分,选取 pivot 时为“三者取中”,即 *first, *(first + (last - first) / 2), *(last - 1) 三者的中位数,这两个算法后面会介绍。median 的源码如下:templ原创 2014-04-26 22:23:39 · 6990 阅读 · 0 评论 -
【算法】划分 partition
STL 中的划分算法 partition 的函数原型如下template ForwardIterator partition(ForwardIterator first, ForwardIterator last, Predicate pred);四点说明:1、作用:将 [first, last) 中所有满足 pred 的元素置于不满足 pred 的元素前面。2、返回值:设返回的迭代原创 2014-04-25 21:44:52 · 6866 阅读 · 0 评论 -
【算法】第 n 小数 nth_element
STL 中取第 n 小数的算法 nth_element 的函数原型如下template<class RandomAccessIterator>void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);算法说明:1、功能:执行 nth_element 后,nth 所指位置的元素将是整个区间有序时在该处的元素。对 [first, nth) 中的任意迭代器 i 和 [n原创 2014-04-30 16:48:02 · 3224 阅读 · 0 评论 -
初尝“元编程”(C++描述)
先看两个计算斐波拉契数的程序:(1)运行时#include using namespace std;const int N = 45;int Fib(unsigned n){ if (0 == n) return 0; if (1 == n) return 1; return Fib(n - 1) + Fib(n - 2);}int main(int argc, c原创 2013-01-02 22:40:56 · 1555 阅读 · 1 评论 -
动态分配的标准写法(new, delete; malloc, free)
1、可能有的人涉及到动态分配只用到下面的这句:#include using namespace std;int main(void){ int *p; p = new int(1); // 1 cout << *p << endl; int *q; q = (int *)malloc(sizeof(int)); *q = 1; cou原创 2012-04-30 12:15:28 · 1305 阅读 · 0 评论 -
const 的用法(持续更新)
先上一段代码:#include using namespace std;int main(void){ int a = 1; const int *p = NULL; p = &a; int *q = p; // 错误 // error C2440: 'initializing' : cannot convert from 'const int *'原创 2012-04-22 22:10:43 · 1317 阅读 · 0 评论 -
函数指针
1、常见的用法#include typedef int (*PFUN)(int, int); // PFUN 是函数指针类型int fun(int a, int b){ return a + b;}int main(void){ PFUN pf = fun; // 或 PFUN pf = &fun; printf("%d\n", pf(1, 2)); print原创 2012-04-14 14:50:02 · 1234 阅读 · 1 评论 -
C++中的Big Three
定义一个有序数组类来说明这个问题:#include using namespace std;#define MAXSIZE 20class A {public: A(void); // 构造函数 A (const A &); // 复制构造函数 A & operator= (const A &); // 重载赋值运算符 ~A() {原创 2012-05-01 18:01:46 · 1433 阅读 · 0 评论 -
【库函数源码剖析系列】(2) strcmp
strcmp:// strcmp#include #include int Strcmp(const char *src, const char *dest){ int ret = 0 ; while( 0 == (ret = *(unsigned char *)src - *(unsigned char *)dest) && '\0' != *dest原创 2012-09-24 12:59:37 · 1692 阅读 · 2 评论 -
auto_ptr类的源码注解
源码及注释如下,这比记忆语法好多了!个人认为,auto_ptr类设计地不行,比如都不能作为参数传递(传递后实参就没用了),失去了C指针的经典优势!// auto_ptr类的简化版,删除了有关auto_ptr_ref及auto_ptr的一些成员函数templateclass auto_ptr{public: typedef auto_ptr ClassType; explicit原创 2012-10-21 21:08:05 · 1250 阅读 · 0 评论 -
文字常量区、字符串常量、地址
可以:#include int main(void){ char str[8] = {0}; str[0] = *"jiang"; printf("%s\n", str); return 0;}输出结果是:j 2012/5/16 更新补充一个例子(正确):#include using namespace std;int main(void){原创 2012-03-31 00:50:25 · 2479 阅读 · 0 评论 -
重载下标运算符[]
看了bitset的源码,发现要重载下标运算符[]内容还挺多的,作右值时相对简单,只用来测试。作左值时就比较麻烦,因为要修改它的值。 1、作右值举个例子:const bitset b;bool tag;tag = b.test(2);tag = b[2];上面第三句和第四句效果一样,都是测试b的下标为2的位是否为1。当bitset为const时,operato原创 2012-10-14 16:09:49 · 5037 阅读 · 0 评论 -
【库函数源码剖析系列】(4) strlen
strlen:// strlen#include size_t Strlen(const char *s){ const char *p = NULL; for (p = s; *p != '\0'; ++p) ; return p - s;}int main(int argc, char **argv){ char buffe原创 2012-09-25 19:59:42 · 1466 阅读 · 1 评论 -
【库函数源码剖析系列】(3) strstr
strstr:// strstr#include char *Strstr(const char *strLong, const char *strShort){ char *cp = (char *)strLong; // cp是当前strShort的头在strLong中的位置 char *pL = NULL; char *pS = NULL; if ('\0' == *原创 2012-09-24 22:24:35 · 3150 阅读 · 0 评论 -
【库函数源码剖析系列】(6) strchr
strchr:// strchr#include char *Strchr(const char *s, int c){ for (; *s != (char)c; ++s) { if (*s == '\0') { return NULL; } } return (char *)s;}int main( int argc, ch原创 2012-09-29 00:53:05 · 2226 阅读 · 0 评论 -
【库函数源码剖析系列】(5) strcat
strcat:// strcat#include #include char *Strcat(char *dest, const char *src){ char *tmp = dest; while ('\0' != *dest) { dest++; } while ('\0' != (*dest++ = *src++)) { ; } return tm原创 2012-09-28 00:50:28 · 1504 阅读 · 0 评论