上编译原理课,老师规定用Java。
在某次实验中,要实现NFA引擎,有一个函数要实现如下功能:
输入若干个整型数组,输出它们的并集。
写下
我就傻了。要是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,一看,是抽象类不能用(你玩我么?既然是抽象类,就是不打算给用户用,干嘛不起一点奇怪的名字)。
继续看,还有HashSet,这个总可以用吧?不行!他的toString()返回的是Object[]……
很好,那我循环读出,总可以了吧?HashSet没有熟悉的begin()、end(),只有一个Iterator(),歇菜了……
没办法,找一个可以按下标取值的容器看看。Google一下,貌似ArrayList符合要求,于是马上写下代码,
但是在get()那里碰壁了,TMD它返回Object!天知道怎么从Object转换成int……
OK,我彻底放弃了使用标准容器的念头。我用原生数组总可以吧?
先找算法。Google一下,Arrays可以sort原生数组,那应该也可以unique吧?没有!
虽说自己写一个unique也就一两个循环,但是还要debug,毕竟不够爽。
STL就是使用原生数组也就是几行代码:
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 阅读(163)
评论(0) 编辑 收藏 引用