在vckbase上看到有討論這樣一個(gè)問(wèn)題:
http://blog.vckbase.com/jzhang/archive/2006/03/28/18807.html
CSDN的朋友參考了Python的實(shí)現(xiàn)源碼給出有如下的解答:
http://blog.csdn.net/imjj/archive/2006/03/31/645163.aspx?Pending=true
性能上已經(jīng)比Python好了,但是該解答畢竟是針對(duì)了具體的應(yīng)用,比如定死了hash桶的大小之類的。
我也湊熱鬧給了一個(gè)實(shí)現(xiàn),只使用標(biāo)準(zhǔn)C++的一些算法解決此問(wèn)題,性能上還是沒有Python好,但是已經(jīng)非常接近了:
D:\test\pytest>python test.py
2006-03-31 14:59:19.348000
2006-03-31 14:59:22.963000
D:\test\pytest>cpptest
經(jīng)過(guò)了4025.7888毫秒
實(shí)現(xiàn):
#include <windows.h>??????//? just for time counting
#include <list>
#include <string>
#include <fstream>
#include <algorithm>
using namespace std;
int main( void )
{
?__int64 t1, t2;
?GetSystemTimeAsFileTime( (LPFILETIME)&t1 );
?list<string> emails;
?ifstream infile("email2.txt");
?ofstream oufile("email_cpp.txt");
?copy( istream_iterator<string>(infile), istream_iterator<string>(), back_inserter(emails) );
?emails.unique();
?ofstream outfile( "email_cpp.txt" );
?copy( emails.begin(), emails.end(), ostream_iterator<string>(outfile,"\n") );
?GetSystemTimeAsFileTime( (LPFILETIME)&t2 );
?printf( "經(jīng)過(guò)了%I64d.%04I64d毫秒\n", (t2-t1)/10000, (t2-t1)%10000 );
}
對(duì)比的其他兩個(gè)實(shí)現(xiàn):
1、vector + sort + unique
2、set
最后還是我的這個(gè)實(shí)現(xiàn)好一點(diǎn):)
PS:編譯器用的是VC2005
再PS,寫了上面那個(gè)PS之后突然想看看VC2003怎么樣,于是測(cè)試一下,驚人的發(fā)現(xiàn):
D:\test\pytest>cpptest2
經(jīng)過(guò)了3234.6512毫秒
速度已經(jīng)超越了Python
.^_^。滿心歡喜結(jié)束這個(gè)討論旅程
// test7.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
using namespace std;
using namespace boost;
namespace
{
template<typename T> char checkSize(T*);
template<typename T> long checkSize(...);
}
template<typename FIRST, typename SECOND>
struct SameType
{
enum{value = sizeof(char) == sizeof(checkSize<FIRST>((SECOND*)0)) };
};
class IFoo
{
public:
virtual void bar() = 0;
};
class Foo: public IFoo
{
public:
virtual void bar(){ cout<<"bar()"<<endl; };
};
template<int>
class TypeSelect
{
public:
template<typename T>
TypeSelect(T& r){}
};
template<> class TypeSelect<true>
{
public:
template<typename T>
TypeSelect(T& r)
{
r.bar();
}
};
template<class T> void func( T& t )
{
(TypeSelect<SameType<IFoo, T>::value>(t));
}
int main()
{
Foo x;
int y;
func(x);
func(y);
}
just mark it:)
boost::thread trd1(boost::bind(&TheClass::theMember), &obj);