2012年2月29日星期三

2012年2月28日星期二

转:关于c++中不能被继承类的实现


关于c++中不能被继承类的实现



-- 源于TopLanguage Groups,整理得之并分享。

template <typename T> 
class FinalClass 

        friend T; 
private: 
        FinalClass(); 
        ~FinalClass(); 
};
class anyOne : public virtual  FinalClass<anyOne> 

  ... 
}; 

C++ 标准规定:virtual base class 的构造函数是被 most derived class 直接(显式或隐式)调用的。如果有 
多个 virtual base 这些 virtual base 的相对构造顺序是沿继承体系从上到下,从左到右。 


看到这个议题,我回去也写了一个简单的类,代码如下: 
namespace FinalClass
{
        template< class T >
        class FinalClass
        {
        private:
                friend T;
                FinalClass(){};
                ~FinalClass(){};
        }; 
};
一共就那么几行代码,可是越看越别扭. 
1. 必须告诉 子类,你需要 virtual 继承.除了注释,没有任何办法告诉使用者加上virtual...... 
2. 这个类的析构函数需要加 virtual 么?如果加上virtual, 那么假设子类没有virtual函数,是不是增加了子类的无谓的负担? 
但是没加 virtual,又没有任何办法阻止类似 FinalClass* 这种指针的声明............. 

本意是要防止继承,但是写了这么简单的几行代码又引发出来了两个额外的问题. 到底值不值得那么写呢.  所以,最好的做法就是如 Shuo
chen 所说, // You are not allow to derive from this class !!!



模板要有调用才会实例化,你可以放到一个main里测试下,另外最好给finalclass加上virtual。如:
int main()
{
   test workingOrnot; 
   return 0;
}
在 2012年2月23日 下午1:35,K.L. <xxxk.l....@gmail.com>写道: 

> 这个不能work啊,
> class test : public anyOne {};
> 编译可以通过。
> On Feb 22, 10:25 pm, Baesky <baesky2...@gmail.com> wrote:
> > template <typename T>
> > class FinalClass
> > {
> >         friend T;
> > private:
> >         FinalClass();
> >         ~FinalClass();
> > };
> > class anyOne : public FinalClass<anyOne>
> > {
> >   ...
> > };
> > 我在网上找的资料普遍就是友元的做法,这是我根据网上的做法利用模板机制做的一个类似java中final语义的类,不知道有什么更好的方法么?

-- end --
    

2012年2月24日星期五

IT淫男们的某一女神的毁灭


看来,度娘已成为过去时了!传闻近日度娘做客《天天向上》节目,网上已有图片流出,瞬间导致众多IT淫男们的某一女神的毁灭……




btw:IT淫男们的女神之一,度娘。在百度2012年会上亮相,凭借“伟大”的事业线而一炮走红!

2012年2月22日星期三

命令模式

命令模式
  -- Command命令模式小小总结





Command 对象的存在正是因该对象需存在不同的时刻表现,小小例子:
---
如对象A在时刻a拥有充足的构造因素而完成构造,但直到时刻b对象A某操作(如接口 Execute())才被调用,甚至跨模块之间,间隔时间(>b-a)更晚,这是仅仅是一个简单的例子。
---

由于你需要延后处理对象,所以你得有个对象将请求保存着那个时刻,如上面例子的对象A。
反映command模式的两个重要特点:
1. 接口分离。如接口 Execute()出现在不同模块,共同拥有。
2. 时间分离。如时刻a,时刻b。
Command对象保存了一个已准备好了的处理请求操作,待某时刻被触发调用。



求N!的尾部连续0的个数




求解N!的尾部连续0的个数.
btw,N! 即阶乘表达式,1 * 2 * ... * N 的结果。不好意思是我啰嗦了哈。

以下描述不同解法。

一般解法,解法1,步骤:
a 求解N!阶乘的结果fac;
b 从fac末位开始,依次向前遍历直至非0。

__int64 Factorial(int n)
{
    if(n<0)
        return -1;// error
    if(n<=1)
        return 1;
    //int f0=1, f1=1,
    __int64     f2=1;
    for(int i=2; i<=n; i++) //__int64
        f2 *= i;
    return f2;
}
int FactorialCount0Num_1(int n)
{
    __int64 fac = Factorial(n);
    int count =0;
    while(fac%10==0)
    {
        count++;
        fac /= 10;
    }
    return count;
}

较高效解法,解法2,步骤:
a 遍历[5, n]之间的数值,找出数值为5倍数。
b 累加计算这些数值除以5的结果。
int FactorialCount0Num_2(int n)
{
    int     count =0;
    for (int i=5; i<=n; i+=5)
    {
        int j=i;
        while (j%5==0&&j!=0)
        {
            count++;
            j = j/5;
        }
    }
    return  count;
}


2012年2月21日星期二

一个字符串匹配问题




一个很难的字符串问题







(来自google group的一条帖子)


---------- Forwarded message ----------

我提一个特殊情况的解法. 直观上觉得算法效率应该可行, 但是实际操作起来还有待考虑.
或许考虑有些疏漏, 望指出.
可行性需要根据具体输入值情况. 或需要继续研究, 有兴趣的可以继续思考.
--
假设, RegEx 表达式包含的字符数目m不多,或其数目n不太大的情况.
1. 针对RegEx包含的m个字符做赋值映射, 再依次将每个RegEx值预处理, 如abc -> c+b*m+a*m*m
转化成一个整型数值pre_values[1 ... n]; 时间复杂度 O(m + n).

2. 排序集合pre_values; 时间复杂度O (n*log(n))
.
3. 从给定字符串in_str获取子串并根据上面规则, 预处理子串转化为整型数值value, 到pre_values匹配.
构建子串:
a 从in_str第一字符作为子串的首字符, 直至最后一个字符作为子串的首字符.
b 确定好子串首字符, 即依次在其后添加字符,作为子串.
c 若子串转化的数值大于pre_value最大值value_max, 则停止.开始下一个字符作为子串的字符.

时间复杂度:
子串的个数, 估算为n *  x (x为不确定数值, x <= n, 且x数值呈现渐小状态).最糟糕情况,  n + (n-1) ...+1 = n(n-1)/2  -> O(n^2).
遍历pre_values次数,  n * x * log(n) - > O(n^2 * log(n))


ps. 该步骤应该是算法的难点.

4. 重复步骤3直至结束以in_str最后一字符作为子串的匹配操作. 记录过程中的匹配结果.
--
... ...

欢迎讨论,拍砖!

> 问题描述:

> 有 n 个 RegEx (正则表达式),标号从 0 到 n-1,n 可能很大 (比如说100万)

> 给定一个字符串,返回能 match 这个字符串的所有正则表达式标号。

> 用 C++ 来描述这个需求:

>     class MultiRegEx {
>     public:
>         struct MatchResult {
>             int nth; // regex NO.
>             int beg; // begin of matched pos in text
>             int end; // end of matched pos in text
>         };

>         // return the index NO. of the internal regex object, -1
> indicate error
>         int add(const char* regex);

>         // compile the MultiRegEx
>         bool compile();

>         // length is the length of text
>         vector<MatchResult> match(const char* text, int length)
> const;
>     };

> 这个问题看上去简单,但其实现非常复杂!一个简单生硬的实现是,随便拿一个正则表达式引擎(如boost.regex, pcre,
> re2, ...),match 时逐个匹配,匹配成功的,加入返回值集合。但这个时间复杂度太高!

> 原则上,unix 下的 lex 可以匹配多个 RegEx,并返回那个被匹配的 RegEx 标号,但好像无法识别多个成功的 RegEx 匹配。

> 这个问题的一个简化版:这 n 个 RegEx 只是简单的 PlainString,就是 Multi String Match 问题,甚至是这个
> 简化版,其实现复杂多都相当高(trie, double array, ...)。

> 我找了很多资料,好像都没有特别合适的办法。

2012年2月19日星期日

我的电脑工具集


我的电脑工具集

我的电脑工具集 (简要罗列,内容不全,不涉及细节,若有兴趣联系,一起交流)

听说过这么一句话,工具,可以作为解放生产力的一种有效途径。,注意仅限于有限范围的情况下。所以,你不能太信但不无道理哈。
以下内容罗列,我的电脑工具集吧。
可以考虑日后持续更新,同时给予一些个人评论与总结,针对某某工具。开始吧:

windows Win7

(工具类型分类)

浏览器

       Chrome,配合诸多插件……
         专门导出整理了一份插件列表,具体的插件列表及其说明详见以下附录内容。
     
          Firefox,配合一些插件……

          IE9,网购支付使用,或是公司点餐(咔咔),或其他特殊使用。
          本人慢慢的养成一点,尽量远离IE浏览器吧。

开发工具

          MS VS2003VS2008msdn……
          codeblocks 10.05
          Eclipse java
          WinHugshaskell
              
      (辅助开发工具)

网络监控

           netpeekerwiresharkMS Network Monitor,金山卫生流量监控……

笔记书签

          Evernote
          win7 系统便签
          有时,记录备份于e-mailgmail或是qqmail

邮箱

          Gmail (关联了诸多邮箱,包括工作邮箱)
          QQmail(关联了其他邮箱)
          YahooMail
          

阅读器

          pdf阅读器foxiWeb版本GReaderWebQQ reader(基于QQmail

代码管理

          SVNTortoiseSVNVisualSVN Server
          GitTortoiseGitWINGW32-Git-BASHgithub.com
          版本对比:TortoiseSVN自带程序,结合Beyond Compare 2UltraCompare

堆栈分析

          windbg
          BugReport文件分析工具1_0_1_25 XL公司自制,内部使用)
     

画图工具

          MS-VisioStarUMLhttp://www.websequencediagrams.com/
          还有其他Web画图工具,具体问Google

聊天工具

          QQRTX
          Gtalk
           飞信

社交网络

          G+Qzone,人人网,知乎,Facebook

文件资源管理

          系统文件资源管理器
          Total Commander


办公文档

          MS-Office2010KS-WPS最新版

文本编辑器

          UltraEditnotepad++Win7自带文本编辑写字板

图片浏览器

          win7系统图像浏览器,google picasawin7自带画图程序。

微博

          腾讯,新浪,豆瓣,twitter

下载

          迅雷,网际快车,QQ旋风。


翻墙工具

          1. 远程VPS(付费)+ ssh客户端XShell + chrome插件SwitchyPlus(多种版本)+ Firefox插件FoxyProxy
          2. google engineGAE+ goagent +  chrome插件SwitchyPlus(多种版本)+ Firefox插件FoxyProxy 
          3. 免费的 GreenVPN

网盘

          金山快盘(安装版与绿色版),everboxdropbox,迅雷网盘,

翻译文件

          有道,金山词霸

杀毒软件

          金山毒霸 + 金山卫士   

Web相册

          picasaweb.google.comwww.flickr.comQQ空间相册。
     

虚拟机

          VMwareVirtualBox ...

视频播放器

          迅雷看看,KMplayer,暴风影音。

     

linux

Ubuntu 工具集(Ubuntu 10.04 LTS)

环境需求

     GCCPythongojava Wine ……   

Programming

【集成开发环境】(IDE
     CodeBlocks svn
版本或10.05
     Eclipse
     Qt

【编辑器】
     Gedit
     VIM +
配置文件
     Emacs +
配置文件

【文本对比】
     Meld
文件差异对比
     SourceGear Diffmerge

 Internet

【浏览器】
     Chrome
最新版本
     Firefox
最新版本
IM & SMS
     Empathy IM Client
          --
支持twitterfacebookflickr等多种连接,社交广播信息。
     Pidgin
          --
支持msngtalkyahooicq等多种账户连接。
     Transmission
          -- BitTorrent
客户端
     gSTM
          -- SSH Tunnel Manager
远程VPS + gSTM + Chrome + 插件switchyplus 帮助顺利翻墙。

 Graphics (图片查看器)
     Picasa
Wine环境)
     F-Spot
     OpenOffice
画图

 Office
     WPS Office
Wine 版本)
     OpenOffice
     xCHM & KchmViewer
          -- chm
文件查看器。
     Dictionary
  
 Sound & Video
     Abraca
          --
音频播放器
     Brasero
          Brasero
是一个刻录 CD-R/W DVD-R/W 的应用程序
     Totem Movie Player
          --
视频音频播放器
     PiTiVi
          --
视频音频编辑器
     SMPlayer
          --
视频音频播放器
     Rhythmbox
          --
音频播放器
     gnome-sound-recorder
          --
录音程序
   

系统工具

Baobab (Disk Usage Analyzer)
          --
查看,分析硬盘使用情况。
     GNOME Terminal 2.30.2
          --
常用终端,毕竟Linux系统下很多操作在终端控制台进行的。

 系统输入法
     ibus
输入法
     fictx
输入法
  
 云笔记
     Evernote
          -- Wine
环境下运行,功能与Windows一样,但没有那么全面。

 Games
    
小型单机游戏,如Chromium B.S.U.AisleRiotgbrainy 等系统自带游戏。



标签分类:
工作
……
学习
……
生活
……
娱乐
……


我的移动设备工具集

     ……(待续)

Chrome插件列表及其说明

网页截图 - Webpage Screenshot4.5.4.4
方便快捷地截取整个网页,并保存为图像。这是第一个可以截取整个页面的扩展。

+Photo Zoom0.1.0.25
Easily zoom photos and profile pics from your Google Plus Stream.

1-Click Web Proxy1.8.83
The fastest way to load the web page through a fast/stable web proxy. You just need click a button to use it. o(∩_∩)o

AdBlock2.5.19
最受欢迎的Google 浏览器扩充功能,拥有超过2 百万位使用者!阻挡网路上所有的广告。

Are You Watching This?! Sports1.71
We watch sports. Every game. Every channel. And alert you when to tune in.

Atomic Bookmarks 22.3.6
Search and organize your bookmarks quickly.

A
股实时行情2.5.1
最新价格, 分时走势图, 支持自选股

Chrome Gestures1.12.0
Chrome Mouse Gestures

Chrome TV2.0.3
Live TV around the world.

Clearly4.3328.304.485
Clearly
可使博客贴文、文章和网页变得简明而又易于阅读。将其保存至 Evernote 以便于任意位置阅读。
在隐身模式下启用允许访问文件网址。

Docs PDF/PowerPoint Viewer
(由 Google 提供)3.7
Google 文档查看器中自动预览 PDF 文件、PowerPoint 演示文稿和其它文档。

FaWave(
发微)2012.1.21.0
FaWave(
发微),支持多微博的Chrome插件,各微博同时提示、无缝切换。有问题请找 @QLeelulu 反馈。

FeedSquares - Supercharge your Google Reader1.3.4
A refreshing way to experience Google Reader on Chrome. Read your favorite feeds in style.

Firebug Lite for Google Chrome?1.4.0.11967
Firebug Lite for Google Chrome, supported by the Firebug Working Group.

Google Calendar Checker
(由 Google 提供)1.2.2
快速查看离您的任意日历中下一次会议还有多长时间。您只需点击该按钮即可进入自己的日历。

Google Dictionary (by Google)3.0.11
View definitions easily as you browse the web.
在隐身模式下启用允许访问文件网址。

Google Tasks (by Google)1.0
Official Chrome Extension for Google Tasks

Google
阅读器通知程序(由 Google 提供)1.3.1
显示您“Google 阅读器帐户中未读消息的条目数。点击该项可显示弹出式预览窗口或打开您的“Google 阅读器帐户。

Highlight to Search (by Google)1.0.34
Highlight to Search allows you search keywords by highlighting instead of typing them into a search box.

iReader1.3.0.2
View news stories and other articles in a very easy to read, clutter-free, scrollable display.

Lookup Companion for Wikipedia1.8.2
维基百科用户必备扩展。功能全面:保存您最近的维基查询记录,多语种,后退/前进等等!

Map My Circles for Google+?1.0.4
See where the people you've circled are living

Mouse Stroke1.9.5.2
使用鼠标手势快速执行操作。支持超级托拽、组合手势、鼠标滚轮手势!翻译自愿者招募中。

PanicButton0.14.1.5
只需按下一个按钮即可隐藏所有标签,且稍后可恢复。

PostRank Extension0.1.7
Filter your Google Reader inbox with PostRank to find and read what matters. Or enhance Digg, Reddit, & search with PostRank.

Proxy Switchy!1.6.3
Manage and switch between multiple proxies quickly and easily.

Proxy SwitchyPlus1.7.2
Manage and switch between multiple proxies quickly and easily.

Proxy SwitchyPlus
汉化版1.7.2.2
轻松管理、随意/自动切换chrome代理.

RSS Subscription Extension
(由 Google 提供)2.1.3
在您的工具栏上添加一键订阅。

Session Manager0.4
Session Manager lets you save sessions of your opened tabs and windows, and to quickly re-open them whenever you like.

Slideshow1.3.1
Turn your favorite photo sites, such as Flickr, Picasa, Facebook, and Google Images into a slideshow.

XML Tree1.9.1.8
Displays XML data in a user friendly way.
在隐身模式下启用允许访问文件网址。

谷歌浏览器转手机扩展程序2.3.1
谷歌浏览器转手机扩展程序可让您将谷歌浏览器中的链接和其他信息发送至 Android 设备。

中国天气预报与万年历2.4.16
中国准确的天气预报与万年历(农历)

关灯看视频2.0.0.53
观看视频时调暗页面,仿佛置身电影院

划世界-划词翻译7.0
划世界(原名划词翻译)

加入卓越亚马逊心愿单1.0.0.4
将任意网站的商品添加到你的卓越亚马逊心愿单

图桌:截屏或打开图片,并标注多维信息3.2.0.1
可以任意截取页面,或者打开本地图片,并标注形状、文字、图标,思维导图信息,最后将其导出为PNG/JPG格式的图片。用于整理思路和工作,计划和跟踪项目,解决基于图片的信息交流问题。

数独益智游戏1.21
享受LabPixies免费数独游戏提供的快乐时光!而且现在,您可以将您解决的数独游戏向朋友发出挑战,看他们是否可以比您完成地更快!如果您的朋友接受挑战而且赢了,他将从您这里赢得分数!但是如果您的朋友输了的话,您就可以赢得额外分数!数千局数独游戏被划分成不同的难度水平,从简单到专家级。数独游戏是如此引人入胜,让您怎舍得离开电脑……

有道词典Chrome鼠标取词插件1.2
支持有道词典在Chrome浏览器中实现鼠标取词

网页截图:注释&批注3.2.6
捕获整个页面或任何部分,矩形,圆形,箭头,线条和文字,模糊敏感信息,一键上传分享注释。支持PNG和链接
在隐身模式下启用允许访问文件网址。

虚拟键盘(由 Google 提供)0.9.8.7
每个包含输入字段的网页上都会弹出虚拟键盘,以便您通过本机脚本键入内容。

虾米音乐网1.1
提供高品质音乐MP3的个性化推荐、发布、P2P下载服务,以及线下音乐活动等互动内容。

购物助手1.4.8
在淘宝、京东、当当、新蛋、拍拍等网站搜索商品的时候,同时搜索卓越(亚马逊中国站)

迅雷下载支持测试版1.3
迅雷下载支持