Give me some reasonThanks

解决方案 »

  1.   

    不一定要STL,不一定要泛型,随你便,没有要求你一定要代码怎么写,除了老板。
      

  2.   

    很少用,偶尔用,stl是c++标准库,如果用mfc或者vcl的库,代码的可移植性较差
      

  3.   

    不考虑移植,就没啥。
    stl里面有不少东西挺好的。
    但是作界面,还是没办法。
    本来界面这个东西,平台差异太大了。要想做到好的可移植性,太难。
      

  4.   

    我想知道STL的优势在哪里?alphapaopao(炮炮) "stl里面有不少东西挺好的。"
    可以举例吗?谢谢了
      

  5.   

    stl的优势就是常用的一些数据结构已经帮你封装好了,vector
    list
    RbTreeMap
    HashMap
    Set
    还有一些常用的算法。
      

  6.   

    STL是个非常好的东西,它为我们做好了很多也许我们在项目中将要去完成的东西提高我们的开发效率特别是在跨平台的开发上更能体现出它的意义所在了
      

  7.   

    STL就是好,就是好来就是好。
    GP就是牛,就是牛来就是牛。从最基础的意义和作用上讲,至少你不用自己去写链表集合之类的数据结构了。且据传,95%的程序员写出来的自己的专用的数据结构要比STL的低效。而从稍微深入一点儿,GP提供了policy-based的设计技术,使代码的复用达到一个相当的高度,而GP也使提供设计样式的模板成为可能。
    建议看:
    C++设计新思维:泛型编程与设计模式之应用
    原书名:Modern C++ Design: Generic Programming and Design Patterns Applied
      

  8.   

    我觉得设计stl,就是c++思想的必然结果
    复用,提高效率等等
      

  9.   

    如果你想使你的代码有可移植性,应使用stl。
    不过这都是狗P.我还真没见过把win32上的程序移植到linux上的
    考虑到运行效率,应该使用win32 API
      

  10.   

    what STL? what Generic Programming?
      

  11.   

    To: BoxFan(译作:饭盒?) 
    STL = Standard Template Library
    Generic Programming 简单点说就是重用吧?如,==运算符,int,float,char,string.....都可以
      

  12.   

    呵呵,给个例子,也许可以说明使用泛型可以省一点代码 ^_^
    这是我前不久遇到的一个问题,使用Windows的API函数RasEnumConnections检测RAS连接时,每个操作系统版本都必须提供不一样的RASCONN结构体,而我这个程序又必须能够运行在任何的Windows版本下,所以试着写了一个类模板。(初学新手,有什么问题望各位大侠指正)/* 文件:RasDetectT.h
     * 功能:检测、断开RAS连接
     * 作者:shootingstars (zhouhuis22 at sina.com.cn)
     * 日期:2004-11-4 20:18
     * 使用例子:
     *         CRasDetect *obj = CRasDetect::GetInstance();
     *        obj->EnumConnections();
     *        obj->HangupAll();    
     *//* 结构体定义
     * 针对Windows的各个版本,定义不同的RASCONN结构体
     */
    struct RASCONNWXP   //for WinXP/2003
    {
    DWORD    dwSize;
    HRASCONN hrasconn;
    CHAR     szEntryName[ RAS_MaxEntryName + 1 ];
    CHAR     szDeviceType[ RAS_MaxDeviceType + 1 ];
    CHAR     szDeviceName[ RAS_MaxDeviceName + 1 ]; CHAR     szPhonebook [ MAX_PATH ];
    DWORD    dwSubEntry; GUID    guidEntry;
    DWORD dwFlags;
    LUID    luid;
    };
    struct RASCONN2000  //for Win2000
    {
    DWORD    dwSize;
    HRASCONN hrasconn;
    CHAR     szEntryName[ RAS_MaxEntryName + 1 ];
    CHAR     szDeviceType[ RAS_MaxDeviceType + 1 ];
    CHAR     szDeviceName[ RAS_MaxDeviceName + 1 ];
    CHAR     szPhonebook [ MAX_PATH ];
    DWORD    dwSubEntry;
    GUID     guidEntry;
    };
    struct RASCONNNT4  //for WinNT4
    {
    DWORD    dwSize;
    HRASCONN hrasconn;
    CHAR     szEntryName[ RAS_MaxEntryName + 1 ];
    CHAR     szDeviceType[ RAS_MaxDeviceType + 1 ];
    CHAR     szDeviceName[ RAS_MaxDeviceName + 1 ]; CHAR     szPhonebook [ MAX_PATH ];
    DWORD    dwSubEntry;
    };
    struct RASCONNW9X  //for Win98/95
    {
    DWORD    dwSize;
    HRASCONN hrasconn;
    CHAR     szEntryName [ RAS_MaxEntryName + 1 ];
    CHAR     szDeviceType[ RAS_MaxDeviceType + 1 ];
    CHAR     szDeviceName[ RAS_MaxDeviceName + 1 ];
    };/*
     * 客户使用接口
     */
    class CRasDetect
    {
    public:
    virtual bool EnumConnections() = 0; // 枚举所有RAS连接
    virtual bool HangupAll() = 0;       // 断开所有RAS连接
    virtual bool Hangup(int index) = 0; // 断开某个(index)RAS连接
    static  CRasDetect *GetInstance();  // 返回特定操作系统版本的CRasDetectT对象(Singleton模式,不支持多线程)
    private:
    static  CRasDetect *Instance;
    };
    CRasDetect *CRasDetect::Instance = NULL;template <class RASCONNT>
    class CRasDetectT : public CRasDetect
    {
    public:
    CRasDetectT();
    ~CRasDetectT();
    bool EnumConnections();
    bool HangupAll();
    bool Hangup(int index);
    protected:
    RASCONNT   *m_lprasconn;
    DWORD     m_connectionCount;           // 枚举获得的连接数目
    DWORD     m_structSize;                // 当前系统RASCONN结构体的大小
    };template <class RASCONNT>
    CRasDetectT<RASCONNT>::CRasDetectT()
    {
    m_structSize = sizeof(RASCONNT);
    }template <class RASCONNT>
    CRasDetectT<RASCONNT>::~CRasDetectT()
    {
    }template <class RASCONNT>
    bool CRasDetectT<RASCONNT>::EnumConnections()
    {
    m_lprasconn = (RASCONNT *)new BYTE[m_structSize];
    DWORD dwCb;
    dwCb = m_structSize;
    m_lprasconn->dwSize = m_structSize;
    DWORD dwErr = RasEnumConnections(
    (RASCONN*)m_lprasconn,
    &dwCb,
    &m_connectionCount);
    if (ERROR_BUFFER_TOO_SMALL == dwErr)
    {
    delete m_lprasconn;
    m_lprasconn = (RASCONNT *)new BYTE[m_structSize];
    m_lprasconn->dwSize = m_structSize;
    dwErr = RasEnumConnections(
    (RASCONN*)m_lprasconn,
    &dwCb,
    &m_connectionCount);
    if(dwErr == ERROR_SUCCESS)
    return true;
    else 
    return false;
    }
    else if(dwErr == ERROR_SUCCESS)
    return true;
    else
    return false;
    }template <class RASCONNT>
    bool CRasDetectT<RASCONNT>::Hangup(int index)
    {
    DWORD err = RasHangUp(m_lprasconn[index].hrasconn);
    if(err == 0)
    return true;
    else
    return false;
    }template <class RASCONNT>
    bool CRasDetectT<RASCONNT>::HangupAll()
    {
    bool result = true;
    for(DWORD i = 0 ; i < m_connectionCount ; i++)
    if(!Hangup(i))
    result = false;
    return result;
    }// 返回当前操作系统的CRasDetectT对象
    CRasDetect* CRasDetect::GetInstance()
    {
    if(Instance)
    return Instance; OSVERSIONINFOEX osvi;
    BOOL bOsVersionInfoEx; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
    {
    osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
    if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
    return NULL;
    } switch(osvi.dwPlatformId)
    {
    case VER_PLATFORM_WIN32_WINDOWS: // Win95/Win98
    return new CRasDetectT<RASCONNW9X>;
    case VER_PLATFORM_WIN32_NT:
    if(osvi.dwMajorVersion>=5)       // Windows 2000( NT5.0 )
    {
    if(osvi.dwMinorVersion >= 1)
    {
    return new CRasDetectT<RASCONNWXP>;
    }
    else
    {
    return new CRasDetectT<RASCONN2000>;
    }
    }  
    else // NT 4.0
    {
    return new CRasDetectT<RASCONNNT4>;
    }  
    break;
    }
    return NULL;
    }
      

  13.   

    UP.STL并不会使你的代码减少,只是写的代码少了.嗯.这应该说是C++的特性.唉.如果C语言也有重载就好了.那D语言好是好.却没有多少厂商支持.郁闷中.-_-#
      

  14.   

    stl提供一系列的模板,可以减少你的工作量
    还有其中的一些基本的算法,使你不需要自己动手重新写
      

  15.   

    To:ming6424(大笨蛋100分)
    谢谢你的解释,我是知道的。我觉得搂住的问题应该是what STL? what Generic Programming?
    or how to use之类的。哈哈
      

  16.   

    “ ShaftWhy(归去来兮) :且据传,95%的程序员写出来的自己的专用的数据结构要比STL的低效。”具体问题具体分析。要不然还自己写算法干吗。也不能以棍子打死。
    越是通用的算法,越是不容易做到高效,越是特殊的算法,越是可以做到高效。
    有一些地方,矛盾不是速度,所以可以采用通用算法,可以大大减少工作量。但是,有一些地方速度很关键,那么采用通用算法就不合适了,必须深入研究,抓住问题的特殊性,来作针对性的优化算法,才能提高效率。