posts - 9,  comments - 11,  trackbacks - 0
上编译原理课,老师规定用Java。
在某次实验中,要实现NFA引擎,有一个函数要实现如下功能:
输入若干个整型数组,输出它们的并集。
写下
int[] foo(int[][] src)
{
}
我就傻了。要是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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

留言簿(5)

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜