C++ 真是一门很复杂的编程语言

Standard

用C++进行编程的时候总会碰到各种瓶颈,而每每仔细研究之后就会发现C++要比原想的那样复杂得多——它太庞大繁杂了:作为C的超集,又集成了各种编程范式,添加了诸如template等的诸多概念,C++已经算是不简单了,这还只是语法本身,更别提大工程之间各种代码之间的交互协调了。

学习C++

但是作为我的首席编程语言,我必须精通它才行,而现在才只是初窥门径。怎样才能快速提高呢?刚才在查资料的时候在stackoverflow上面看到了一段话提醒了我:

The only reasonable way to learn C++ is by reading... no matter how smart you are there is no way you can guess what the committee decided (actually being smart is sometimes even a problem because the correct answer is illogical and a consequence of historical heritage).

作为一个很少阅读大神代码的人可谓是吃尽了苦头——经常会碰到一些匪夷所思的问题,绞尽脑汁去思考,尝试,很久才发现这些问题都并不复杂,只是思维方式没有对而已。到底是因为我并没有专门的腾出来时间来读C++的书…(可惜真的有更重要的事要做)

我与C++

从初三的暑假算起到现在已经接触和“使用”C++将近4年半了,这期间对它的理解和掌握大概可以分三个阶段:

  • 刚开始的一年里几乎是完全以C的用法来使用C++的,没有任何面向对象的概念。
  • 再接着直到高三暑假接触了一些面向对象程序设计、C++核心的概念:类的一般用法,标准模板库的简单使用,基本上这段时间写的程序主要就是算法竞赛式的单文件程序
  • 最后就是从大学开始到现在这段时光,我明白了子类对基类的继承,类的多态(虚函数的使用)特性,以及接触了一些大型C++程序的代码,比如折腾了一段时间Havok物理引擎,写了一些上千行的东西,比如自己写的光线追踪器(ray tracer),以及现在正在写的计算几何库。

可以说现在我的C++编程水平仅仅是刚入门,因为高中的时光我的注意力主要是在算法和数据结构上面,对于编程语言本身并没有太在意(除了一些奇奇怪怪的错误让我不得不在意),而大一也并没有去学习很多进阶的内容(比如标准模板库是如何实现的,元编程(metarpogramming)等)

最后推荐一个书单,有各种讲解C++的书,总有一款适合你:D.

Written with StackEdit.

wolfram 语言特性介绍

Standard

wolfram语言 出自mathematica ,这里翻译一篇wolfram语言特性的文章,以便感兴趣的朋友了解!

本文翻译自此文

  • 目的: 科学计算、编程,数据操作,但也是通用编程语言
  • 许可: 专有许可
  • Standard: defined by a single implementation
  • 离硬件的距离: 极其高层(垃圾收集,无显式引用(指针),最优化符号编程)
  • 平台 – 跨平台 (一些文件格式不支持).
  • 支持以下
    • Windows
    • Linux
    • Mac OS
    • 一些其他平台
  • 性能: 从与C的速度相仿到非常慢不定。依问题、使用的编程技术、编程者水平而定。对于特定的编程问题来说一个熟练的mathematica使用者能使性能达到C/C++的十分之一。
  • 核心执行模型: term-rewriting, infinite (fixed-point) evaluation
  • 编程范式: 多范式 – 基于规则、 函数式, 命令式、逻辑式
  • 与之相似的语言: Lisp, Prolog, APL
  • 类型系统: 弱动态类型 (untyped)
  • 组件系统和命名空间: 支持, through Mathematica contexts and packages.
  • 编译型/解释型: 解释型, 语言的一小部分也可以编译成二进制码和C (本地代码)
  • 能生成独立的可执行文件码?: 可编译的部分可以, 否则的话只能通过Mathematica Player来运行
  • 支持的数据结构: 不可变数据结构 不支持可变数据结构
  • 面向对象编程的支持: 不支持, 但有第三方面向对象的扩展包.
  • 元编程: 支持 – 把代码也视为数据, 可以执行自我测试, 代码生成等
  • 第三方库是否可用?: 有,但有限制
  • 并发模型: 粗粒度(parallel evaluation, a separate kernel launched for each available core, a number of high-level parallel programming primitives available), fine-grained for compiled code – through native threads and automatic parallelization available in Compile – but limited to the code amenable to Compile
  • FFI (外部函数接口): Yes. Can load external libraries (wrapper C code is needed) through LibraryLink.
  • 互操作性: 支持 C (MathLink/LibraryLink), Java (J/Link), .Net (.Net/Link)
  • 可否与数据库连接: 可以,通过databaselink连接 (uses JDBC internally).
  • 开发工具: 交互式基于单元的前端环境,带语法高亮。对于大工程有基于Eclipse的WolframWorkbench集成开发环境,支持分析器、调试器、单元测试,也支持混合项目开发(即Java/Mathematica)

观察知乎网部分用户“关注网络”

Standard

我们在数据的海洋中游荡,有效率的抓取想要的信息是十分有必要的,而很大部分的信息都存在于互联网上,怎么快速有效的获取到它们呢?人工去找?太落后啦,程序最擅长这种事了!

早就知道“网络爬虫”这种程序,它们能自动的访问一些网站并且能根据网站中的超链接再跳到其他网站,设计“网络爬虫”的目的大多是获取网站数据并下载下来供日后分析以及使用,比如某个网站上有很多很多你想要的图片,人工的去一个一个下载实在是太麻烦了。而写一个简单的“爬虫”程序,计算机就可以很快的自动把所有你想要的图片都下载下来,节省了大量的时间!

我一直在知乎上阅读各种问题和答案,可是我发现除了那种行业大V很快会走入你的视野外,你很难找到某个圈子中你觉得值得关注的人,如果知道知乎的数据的话那想找到这种人的难度就会减少,如何获取数据?写个爬虫吧。

在Github上面看到其他人写好的获取知乎数据的开源项目(我对其的扩展在这里)就直接拿来用啦,写个搜索就开始爬!首先从Chenyao-45(chenyao关注的用户主要是OIer,所以对于要爬规模较小的数据很合适!)首先先来20个人的互相关注关系(谁是业界出了名的一眼就能看出来:D)

zhihu1

颜色越深说明关注TA的人数越多,弧线指向谁就是谁被关注了,弧线越深、箭头越大说明是关注者名气越大,接下来增加数据规模——

 

 

zhihu2

 

可以看出vczh和王小川是当前数据规模圈子里最有名的两个(IT行业),而在这个圈子里面对“带三个表”的关注度远远没有在整个知乎的关注度高,这也是显然的:D

关于计算机的位长

Standard

在2014年,市面上的笔记本电脑大多都是64位的了,安装着64位的操作系统,在几年前流行的是32位的计算机,安装着32位的系统,很多人一定很疑惑这些位长代表着什么,接下来让我们谈谈他们的意思吧。

在现在的计算机中,信息用二进制来表示,一个二进制数称之为”比特“(Bit),八个比特称之为一个”字节“,几个字节被称之为”字“(具体有几个字节因计算机类型的不同而不同)

计算机主要有这几个部分:处理器(CPU),数据通路,内存,输入设备和输出设备。硬盘是存储用的设备,可以归为输入设备。一般来说让计算机处理数据需要把数据从输入设备输入到内存,处理器就可以从内存读取数据,并进行计算,计算完成后再存回内存,最终通过输出设备输出(输出的可能到显示器,扬声器,等等)。程序们都运行在内存内,内存造价高,输入输出的速度快,以方便CPU计算数据并返回给程序

交给处理器一个指令后,处理器需要知道要操作数据的地址,并从那些地址读入数据或写入数据,而如果内存过大,寄存器存不了的话,就有的内存无法检索了,这就是为什么32位的计算机支持的内存上限已经小于我们对内存的需求。

priority_queue的简单用法

Standard

priority_queue:优先队列

顾名思义,这个东西可以用于存放单调的数据,后面将会看到用于优化Dijkstra

有5个类函数:

void push(元素类型   变量)

void pop()

int top()

int size()

bool empty()

分别是:

  • 加入类型是XXX的变量XXX
  • 弹出队列首元素
  • 取优先队列的队首元素的值
  • 返回队列元素数量
  • 查看队列是否为空

定义:

  1. priority_queue <数据类型容器类型元素比较方式>
  2. priority_queue <数据类型容器类型>
  3. priority_queue <数据类型>

数据类型:int,double…..

容器类型:vector(默认),deque,但不能是list

元素比较方式:less(默认,不上升序),greater(不下降序)

 

比如要定义一个元素值为整数,容器为vector<int>的不下降序的优先队列PQ:

 

priority_queue <int,vector<int> ,greater<int> >PQ

 

如果是第3种定义方式,容器默认为vector,比较方式默认是less(第二种的默认比较方式也是less)

实用的例子:

堆优化的Dijkstra算法,写出堆不难,但麻烦,如果想更快的写出高效的Dijkstra,用priority_queue就很不错:

 

#include 
priority_queue ,vector >,greater > > PQ;
 
void Dijkstra()
{
    while(!PQ.empty())
        PQ.pop();
    MC[1]=0;
    PQ.push(pair(MC[1],1));
    while(!PQ.empty())
    {
    int Index=PQ.top().second;
        PQ.pop();
        if(!flag[Index])
        {
            flag[Index]=true;
            for(Node *p=last[Index];p;p=p->Prev)
                if(!flag[p->Name] && MC[p->Name]>MC[Index]+p->Dis)
                {
                    MC[p->Name]=MC[Index]+p->Dis;
                    PQ.push(pair(MC[p->Name],p->Name));
                }
        }
    }
}

MC是最小花费

flag标志数组

last 邻接表

更详细的信息请参阅:

http://www.cplusplus.com/reference/queue/priority_queue/priority_queue/

参考

cplusplus.com

http://blog.chinaunix.net/space.php?uid=533684&do=blog&cuid=2615612