上編譯原理課,老師規(guī)定用Java。
在某次實(shí)驗(yàn)中,要實(shí)現(xiàn)NFA引擎,有一個函數(shù)要實(shí)現(xiàn)如下功能:
輸入若干個整型數(shù)組,輸出它們的并集。
寫下
我就傻了。要是C++,我可以用幾行代碼就完成:
pair<int*, int> func(int** src, int num, int* len)


{
set<int> temp;
for (int i = 0; i < num; i++)
for (int j = 0; j < len[num]; j++)
temp.insert(src[i][j]);

int* v = new int[temp.size()];
std::copy(v, v + temp.size(), temp.begin());
return make_pair(v, temp.size());
}

但是Java就丑陋了。寫下java.util.,有Set,一看,是抽象類不能用(你玩我么?既然是抽象類,就是不打算給用戶用,干嘛不起一點(diǎn)奇怪的名字)。
繼續(xù)看,還有HashSet,這個總可以用吧?不行!他的toString()返回的是Object[]……
很好,那我循環(huán)讀出,總可以了吧?HashSet沒有熟悉的begin()、end(),只有一個Iterator(),歇菜了……
沒辦法,找一個可以按下標(biāo)取值的容器看看。Google一下,貌似ArrayList符合要求,于是馬上寫下代碼,
但是在get()那里碰壁了,TMD它返回Object!天知道怎么從Object轉(zhuǎn)換成int……
OK,我徹底放棄了使用標(biāo)準(zhǔn)容器的念頭。我用原生數(shù)組總可以吧?
先找算法。Google一下,Arrays可以sort原生數(shù)組,那應(yīng)該也可以unique吧?沒有!
雖說自己寫一個unique也就一兩個循環(huán),但是還要debug,畢竟不夠爽。
STL就是使用原生數(shù)組也就是幾行代碼:
pair<int*, int> foo(int** src, int num, int* len)


{
vector<int> temp;
for (int i = 0; i < num; i++)
for (int j = 0; j < len[num]; j++)
temp.push_back(src[i][j]);

std::sort(temp.begin(), temp.end());
temp.erase(std::unique(temp.begin(), temp.end()), temp.end());

int* v = new int[temp.size()];
std::copy(v, v + temp.size(), temp.begin());
return make_pair(v, temp.size());
}

無限想念STL……
posted on 2009-03-17 14:49
lingol 閱讀(168)
評論(0) 編輯 收藏 引用