在C++中有多种方式可以进行数据拷贝,但它们实现的方式略有不同。 memcpy memcpy原型如下,其以字节为单位,可以用来拷贝非重合区域。也就是说如果拷贝的源、目的有重合部分的话,结果是undefined,意味着可能偶尔也是对的。但最好不要这么做,原则上memcpy是一种后向拷贝机制:从区间的最后一个元素开始进行拷贝,直到第一个元素。 void* memcpy( void* dest, const void* src, std::size_t count ); memmove memmove可以支持重合区域的拷贝,其实现可以理解为memmove用另外一块buffer缓存src数据,然后往dst拷贝。但实际上并不是这样,代码在输入时会进行判断:如果src地址小于dst地址,进行后向拷贝;反之如果src地址大于ds…
Read more
STL中的关联容器分为set和map两大类,以及他们的衍生体multiset和multimap,这些容器均由红黑树(RB-tree)实现。另外,STL还提供了不在标准之外的关联式容器:hashtable以及以此为底层机制的hash_set,hash_map和他两的multi衍生体。 以红黑树和哈希表为底层结构构造的容器最大的不同是前者为直接排序而后者不是。 1.红黑树 我的这篇博客介绍了红黑树和AVL树的大概轮廓,具体插座和查找细节可以参考《算法导论》,此处不介绍这些细节了。红黑树是一种接近平衡的平衡二叉搜索树,拥有良好的查找、插入复杂度。 STL中的RB-tree提供了两种插入操作:insert_unique()和insert_equal(),前者表示被插入节点的key值独一无二,后者表示ke…
Read more
在STL中,有以下几个序列式容器:array、vector、heap、priority_queue、list、slist、deque、stack、queue。其中vector、list、deque为三个标准容器(container);stack和queue是在deque上进行封装而成的,专有名词叫做配接器(adapter);array是C++内建容器,不对外使用;heap是基于vector封装的,priority_queue是基于heap封装的;slist是非标准的单向链表。 1.vector vector是C++中的动态数组,可以动态增删,而不需要类似静态数组自己维护空间的分配,其维护的也是一个连续线性空间,支持随机存取,良好的特性使得其成为STL中最常用的容器之一。 vector中有几个需要注意的概念: vecto…
Read more
今天,看到一个很好的例子,讲解指针和高维数组: 比如声明如下:int a[4][5]; 则: &a: 表示数组的首地址 a: 类型为int (*)[5],即a为指向数组a第0个元素a[0]的指针,且a为常量,不可以进行赋值运算,a+i的类型也同为int (*)[5],指向a[i];&a+1等同于&(a+1)跳过全部20个元素,指向数组末尾的下一个。 *a或a[0]: 类型为int *,*a为指向数组a[0]首元素a[0][0]的指针; *(a+1)或a[1]: 类型也为int *,因a的类型为int (*)[5],即a指向一个有5个元素的一维数组,故a+1将跳过5个元素。则(a+1)为指向数组a的第1个元素a…
Read more