2014年10月8日
摘要: 转载请注明出处:http://www.cnblogs.com/inevermore/p/4012079.html RTTI,指的是运行时类型识别技术。 先看一个貌似无关的问题: 为继承体系重载 #include #include using namespace std; class Animal { public: virtual bool equal(con... 阅读全文
posted @ 2014-10-08 21:22 inevermore 阅读(414) 评论(0) 推荐(0) 编辑
  2014年10月7日
摘要: 生产者消费者问题是计算机中一类重要的模型,主要描述的是:生产者往缓冲区中放入产品、消费者取走产品。生产者和消费者指的可以是线程也可以是进程。 生产者消费者问题的难点在于: 为了缓冲区数据的安全性,一次只允许一个线程进入缓冲区,它就是所谓的临界资源。 生产者往缓冲区放物品时,如果缓冲区已满,那么需要等待,一直到消费者取走产品为止。 消费者取走产品时,如果没有物品,需要等... 阅读全文
posted @ 2014-10-07 19:45 inevermore 阅读(1341) 评论(1) 推荐(0) 编辑
摘要: 我们不止一次写过这种代码: { mutex_.lock(); //XXX if(....) return; //XXX mutex_.unlock(); } 显然,这段代码中我们忘记了解锁。那么如何防止这种情况,我们采用和智能指针相同的策略,把加锁和解锁的过程封装在一个对象中。 实现“对象生命期”等于“加锁周期”。 代码... 阅读全文
posted @ 2014-10-07 19:19 inevermore 阅读(546) 评论(0) 推荐(1) 编辑
  2014年10月6日
摘要: 在之前,我们写过类似的stacktemplate >class Stack{public: void push(const T &); void pop(); T top() const; bool empty() const;private: Alloc cont_... 阅读全文
posted @ 2014-10-06 20:46 inevermore 阅读(1942) 评论(0) 推荐(1) 编辑
摘要: C++11提供了thread,但是过于复杂,我们还是倾向于在项目中编写自己的Thread。 Posix Thread的使用这里不再赘述。 重点是这个函数: #include int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_... 阅读全文
posted @ 2014-10-06 18:55 inevermore 阅读(1617) 评论(0) 推荐(0) 编辑
摘要: 条件变量主要用于实现线程之间的协作关系。 pthread_cond_t常用的操作有: int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_cond_signal(pthread_cond_t *cond); int pthread_cond_broadcast(pt... 阅读全文
posted @ 2014-10-06 16:37 inevermore 阅读(1386) 评论(2) 推荐(0) 编辑
摘要: 本文对Linux中的pthread_mutex_t做一个简易的封装。 互斥锁主要用于互斥,互斥是一种竞争关系,主要是某一个系统资源或一段代码,一次做多被一个线程访问。 条件变量主要用于同步,用于协调线程之间的关系,是一种合作关系。 Linux中互斥锁的用法很简单,最常用的是以下的几个函数: int pthread_mutex_init(pthread_mutex_t *mutex, ... 阅读全文
posted @ 2014-10-06 16:28 inevermore 阅读(1313) 评论(0) 推荐(1) 编辑
  2014年10月5日
摘要: 上节我们实现了back_inserter和front_inserter,接下来是更为普通的插入迭代器,它允许用户指定插入位置。实现代码如下:#ifndef ITERATOR_HPP#define ITERATOR_HPPtemplate class InsertIterator{public: ... 阅读全文
posted @ 2014-10-05 19:54 inevermore 阅读(317) 评论(0) 推荐(0) 编辑
摘要: 本文讨论back_inserter和front_inserter的实现。当我们调用copy函数的时候,要确保目标容器具有足够大的空间,例如://将other的所有元素拷贝到以coll.begin()为起始地址的位置copy(other.begin(), other.end(), coll.begin... 阅读全文
posted @ 2014-10-05 19:12 inevermore 阅读(782) 评论(1) 推荐(0) 编辑
摘要: 优先级队列相对于普通队列,提供了插队功能,每次最先出队的不是最先入队的元素,而是优先级最高的元素。 它的实现采用了标准库提供的heap算法。该系列算法一共提供了四个函数。使用方式如下: 首先,建立一个容器,放入元素: vector coll; insertNums(coll, 3, 7); insertNums(coll, 5, 9); insertNums(coll, 1, 4); ... 阅读全文
posted @ 2014-10-05 16:37 inevermore 阅读(608) 评论(0) 推荐(0) 编辑
  2014年10月4日
摘要: 跟上篇实现stack的思路一致,我增加了一些成员函数模板,支持不同类型的Queue之间的复制和赋值。 同时提供一个异常类。 代码如下: #ifndef QUEUE_HPP #define QUEUE_HPP #include "Exception.h" #include class EmptyQueueException : public Exception { public: ... 阅读全文
posted @ 2014-10-04 20:29 inevermore 阅读(481) 评论(0) 推荐(0) 编辑
摘要: 本文实现了STL中stack的大部分功能,同时添加了一些功能。 注意以下几点: 1.Stack是一种适配器,底层以vector、list、deque等实现 2.Stack不含有迭代器 在本例中,我添加了几项功能,包括不同类型stack之间的复制和赋值功能,可以实现诸如Stack >和Stack >之间的复制和赋值,这主要依靠成员函数模板来实现。 为了更方便的实现以上功能,我添... 阅读全文
posted @ 2014-10-04 19:51 inevermore 阅读(819) 评论(0) 推荐(0) 编辑
  2014年10月3日
摘要: C++的异常类是没有栈痕迹的,如果需要获取栈痕迹,需要使用以下函数: #include int backtrace(void **buffer, int size); char **backtrace_symbols(void *const *buffer, int size); void backtrace_symbols_fd(void *const *buffer, int ... 阅读全文
posted @ 2014-10-03 23:43 inevermore 阅读(1477) 评论(0) 推荐(0) 编辑
摘要: 前面我们使用了uninitialized_fill,来批量初始化某一段内存。 下面提供三个函数的实现代码,这三个代码的共同点是: 1.遇到错误,抛出异常 2.出现异常时,把之前构造的对象全部销毁 所以,这三个函数要么成功,要么无任何副作用。使用异常来通知使用者,所以在catch块中,处理完异常后要将异常再次向外抛出。 #ifndef MEMORY_HPP #define... 阅读全文
posted @ 2014-10-03 00:40 inevermore 阅读(385) 评论(0) 推荐(0) 编辑
  2014年10月2日
摘要: 自己实现Allocator并不难,其实只需要改变allocate和deallocate,来实现自己的内存分配策略。 下面是一个std::allocator的模拟实现 #ifndef ALLOCATOR_HPP #define ALLOCATOR_HPP #include #include template class Allocator { public: typ... 阅读全文
posted @ 2014-10-02 17:18 inevermore 阅读(551) 评论(0) 推荐(0) 编辑
摘要: 上一篇我们提到了new运算符以及它的工作步骤,其实无非是把两项工作独立出来:1.申请原始内存2.执行构造函数delete也涉及了两个工作:1.执行析构函数2.释放原始内存其实标准库提供了另外一种更加高级的手段实现内存的分配和构造,就是std::allocator的职责。allocator提供了四个操... 阅读全文
posted @ 2014-10-02 17:11 inevermore 阅读(1227) 评论(0) 推荐(0) 编辑
  2014年10月1日
摘要: 采用自定义的operator运算符实现自己的内存分配策略,在某些时候可以提高程序的效率。 C++中的new运算符,具体工作流程如下: 1.调用operator new申请原始内存 2.调用place new表达式,执行类的构造函数 3.返回内存地址 而delete操作符的工作是: 1.调用对象的析构函数 2.调用operator delete释放内存 ... 阅读全文
posted @ 2014-10-01 23:43 inevermore 阅读(958) 评论(0) 推荐(0) 编辑
  2014年9月29日
摘要: 这里的迭代器能够与STL组件共同工作,是对STL的一种扩充。 自定义迭代器必须提供iterator_traits的五种特性,分别是迭代器类型、元素类型、距离类型、指针类型与reference类型。 这里我们继承标准库提供的iterator即可。 代码如下: MyIterator.hpp 该迭代器针对于关联容器 #ifndef MYITERATOR_H_ #defin... 阅读全文
posted @ 2014-09-29 21:17 inevermore 阅读(380) 评论(0) 推荐(0) 编辑
摘要: 增加了逆置迭代器的实现 以及swap功能 完整代码如下: #ifndef VECTOR_H_ #define VECTOR_H_ #include #include #include template class Vector { public: typedef T *iterator; typedef const T *const_iterat... 阅读全文
posted @ 2014-09-29 02:20 inevermore 阅读(360) 评论(0) 推荐(0) 编辑
摘要: 连接数据库的步骤: 1.加载JDBC驱动 2.提供连接参数 3.建立数据库连接 4.创建一个statement 5.执行SQL语句 6.处理结果 7.关闭JDBC对象 新建一个JDBCUtil类 package com.jdbc.utils; import java.sql.Connection; import java.sql.DriverManage... 阅读全文
posted @ 2014-09-29 00:42 inevermore 阅读(378) 评论(0) 推荐(0) 编辑