随笔-90  评论-947  文章-0  trackbacks-0
 

如题,想进行带模板参数的 typedef,如:

template <typename T>

typedef RBTree<T> Set<T>;

template <typename T>

typedef Set<List<T>> MultiSet<T>;

template <typename K, typename V>

typedef Set<Pair<K, V>> Map<K, V>;

template <typename K, typename V>

typedef Map<K, List<V>> MultiMap<K, V>;

却无这种语法。

 

目前能想到的就是

template <typename T>

class Set : public RBTree<T>

{

};

template <typename T>

class MultiSet : public Set<List<T>>

{

};

template <typename K, typename V>

class Map : public Set<Pair<K, V>>

{

};

template <typename K, typename V>

class MultiMap : public Map<K, List<V>>

{

};

 

不知有没有更好的方法?

posted @ 2009-11-07 20:26 溪流 阅读(559) | 评论 (3)编辑 收藏
我被那些 红黑树规则+双向指针 搞得头昏脑胀了
现在总算有点头绪了,自己看看似乎没问题
求请各位大大有空帮忙小测试一下,可能有些情况我还是没考虑到

测试程序下载
(如果有问题,烦请告知操作序列(可以按 P 查看))
posted @ 2009-11-05 14:50 溪流 阅读(328) | 评论 (1)编辑 收藏

测试程序是一个 InstallShield 做的 Windows Installer 安装程序,发布方式为单一 EXE,Menifest 中指定 requireAdministrator,在 Win7 标准用户下双击执行,在弹出的 UAC 对话框中选择一个管理员用户。这种情况下,对于这个程序来说,HKEY_CURRENT_USER 为管理员用户的数据,SH… 系列 API 的执行环境也是管理员用户,如 SHGetFolderPath 取 AppData 目录取到的是管理员用户的 AppData 目录。

但如果从控制面板=>添加删除程序(程序和功能)里执行(相当于执行 msiexec /…),在过一会儿弹出的 UAC 对话框中选管理员用户,此时 HKEY_CURRENT_USER 为管理员用户的数据,但是 SH… 系列 API 的执行环境却是标准用户。查看两个 MsiExec.exe 进程,其中一个是 System 用户的,也就是 Windows Installer 服务对应的进程;另一个是管理员用户的,但是用 Process Explorer 查看,它的所有环境路径全是标准用户的。

觉得有点奇怪,是以记之。^_^

posted @ 2009-10-22 19:50 溪流 阅读(670) | 评论 (0)编辑 收藏

我作了双向扩充实现。昨天的方案是:

先判断插入的元素靠前还是靠后,靠哪边就准备往哪边挪旧元素,然后检查那头有没有空,没空换另一头,要是都没空但两头加起来却有空,那就重新调整位置,最后才重新分配空间。

我原以为考虑得好周到,可是实现起来却傻了眼。往末尾插入10万数据,有9万多次发生移动元素,不慢才怪。

 

调整了下,变成:

先判断考前还是靠后,靠哪边就往哪边挪旧元素,如果那头没空,直接重新分配空间,空间按每次*3增长直至足够。

 

这样,push_back 的性能与 std::vector 以及 std::deque 的粗略比较如下(图中的单位写错了,全是秒):

image

image

image

image

 

insert(begin(), i) 比较:

image

image

(vector 参与这项比较果然是不公平的,呵呵)

image

image

 

insert 到 begin + size() / 2 处:

image

image

 

resize 至固定大小,然后用 iterator 遍历赋值:

image

image

image

image

(今天回家了。以上测试都在家里的机器上做的,配置: AMD SP2500+ 1.4GHz,512MB RAM。)

 

这样的结果还算满意的。不知道 vector 为什么能保持 push_back 如此高效~

还有个挺奇怪的现象,使用 deque 的时候,如果数据量到百万,临退出前有好长一段时间要等待,难道是 deque 在做某些析构动作?

再呢。。貌似 deque 的 push_front 并没有 vector 的 push_back 神么、、

 

嗯……我的本意不是为了着重性能,而是尝试些有着那么一套接口的东西出来,同时也给自己用。现在来比性能只是为了论证一下实用程度如何,如此而已。

具体实现代码就不贴了,基本接口和上上篇里没多少变化。等以后这方面的东西做完了再一起拿出来。

posted @ 2009-10-01 20:17 溪流 阅读(315) | 评论 (1)编辑 收藏

push_back 100000 次,比 std::vector 慢100倍,比 std::deque 慢八九倍

push_back 1000000 次,std::vector 0.0x 秒,std::deque 0.1x秒,我的……等了一分钟没等到,放弃了

 

虽然我不注重性能,但也不能差这么多呀,慢一两倍也差不多了……继续改进

 

居然已经是国庆了

posted @ 2009-10-01 00:56 溪流 阅读(730) | 评论 (0)编辑 收藏
仅列出标题
共18页: First 10 11 12 13 14 15 16 17 18