让人无法喜爱的STL

 
STL最引以为豪的就是遍历器,但STL的遍历器却有是一个及其弱智的东西。本来是想要掩盖底层容器实现的不同,但实际如何呢,遍历器没有一个共同的基类,没办法用一个对象来表示不同的底层实现的遍历器,如对vector要写
vector<int>::iterator iter = myVector.begin()
对map要写
map<int, int>::iterator iter = myMap.begin()
使用者还是要对不同的容器写不一样的代码。而不能这么写
iterator i1 = myVector.begin()
iterator i2 = myMap.begin()
 
更可气的是,对map的遍历器访问时要写(*i2).first (*i2).second,连编程的最基本的原则“变量名要反映变量的实际用途”这点都违背了。难道就不能把first改成key,把second改成value吗!遍历器不是单独的对象,不能脱离底层容器单独使用,这点对面向对象的封装是极大的破坏,比如一个函数不能这么写
iterator foo()
因为这么写客户代码不知到怎么使用这个遍历器,只能写
vector<int> foo()
这样客户代码才可以用
for(vector<int>::iterator i = myVector.begin(); i!=myVector.end(); i++)
这样就把foo()函数里面使用的存储对象类型完全暴露了出来
 
这种遍历器唯一的“好处”就是把一个对象的访问“居然”能写的和一个for(int i=0;i<10;i++)一样的格式!把两种完全不同的东西非要写成相似的格式,而且并不带来任何好处,反而让读程序的人更头晕,典型的不成熟的小程序员玩弄把戏的表现。写STL的人去参加IOCC大赛绝对拿第一名。
 
STL本身就是对软件工程的一个极大破坏。现在的软件都讲究模块化,面向对象,特别是C++作为一个比较完善的面向对象语言,一个好的设计应该是接口定义和实现分开,便于共享和保护知识产权,早在C的时代就有把头文件和实现文件分开写的习惯了。到STL在反其道而行之,索性取消的头文件和实现文件,都不写任何扩展名,比如
#include <vector>
早成一系列的编译和使用的问题。比如两个文件f1.cpp和f2.cpp都使用了vector,把f1和f2同时编译还好不会出问题,如果把f1和f2分开编译,链接的时候就会经常报告说某个函数重复定义了。
 
vector提供了反向遍历器reverse_iterator,但把这个遍历类型传给erase函数进行删除时却又拒绝接受!难道用户使用遍历器只是为了看数据,而不进行对数据的修改!而且vector除了这个erase函数外并不提供其他任何的删除函数,难道设计者是不是想让使用者先用reverse_iterator找到这个元素,然后再用iterator重新遍历到这个元素然后删除。
 另外:
1. 没有足够的文档
2. 继承和使用关系混乱
3. 代码难懂, 特别是STL本身的代码, 如
template <class Elem, class Tr = char_traits<Elem> >
    class basic_filebuf : public basic_streambuf<Elem, Tr>
4. 太多的模板嵌套
5. 对象粒度太小, 要求使用者知道所有的对象构造细节才能有效使用。 如ifstream,原来是basic_ifstream的重定义。它的一个成员是这么定义的
rdbuf Returns the address of the stored stream buffer.
rdbuf又是一个basic_filebuf<Elem, Tr> *rdbuf( ) const。本来操作文件这么一个简单的事情,弄出很多个对象来,而且每个对象的定义都使用模板,搞得很是抽象,很是难懂。
6. 不同的厂家实现可能有不同,下面的代码在VC上能通过,在gcc上通不过
    class Comparator
    
{
    
public:
        
bool operator()(HpCorePtr p1, HpCorePtr p2)
        
{
            
return p1->getId() < p2->getId();
        }

    }
 comp;
    
for(std::map<AString, std::list<HpCorePtr> >::iterator i = hpsByType.begin(); i != hpsByType.end(); ++i)
    
{
        i
->second.sort(comp);
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值