why STL? why Generic Programming? Give me some reasonThanks 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不一定要STL,不一定要泛型,随你便,没有要求你一定要代码怎么写,除了老板。 很少用,偶尔用,stl是c++标准库,如果用mfc或者vcl的库,代码的可移植性较差 不考虑移植,就没啥。stl里面有不少东西挺好的。但是作界面,还是没办法。本来界面这个东西,平台差异太大了。要想做到好的可移植性,太难。 我想知道STL的优势在哪里?alphapaopao(炮炮) "stl里面有不少东西挺好的。"可以举例吗?谢谢了 stl的优势就是常用的一些数据结构已经帮你封装好了,vectorlistRbTreeMapHashMapSet还有一些常用的算法。 STL是个非常好的东西,它为我们做好了很多也许我们在项目中将要去完成的东西提高我们的开发效率特别是在跨平台的开发上更能体现出它的意义所在了 STL就是好,就是好来就是好。GP就是牛,就是牛来就是牛。从最基础的意义和作用上讲,至少你不用自己去写链表集合之类的数据结构了。且据传,95%的程序员写出来的自己的专用的数据结构要比STL的低效。而从稍微深入一点儿,GP提供了policy-based的设计技术,使代码的复用达到一个相当的高度,而GP也使提供设计样式的模板成为可能。建议看:C++设计新思维:泛型编程与设计模式之应用原书名:Modern C++ Design: Generic Programming and Design Patterns Applied 我觉得设计stl,就是c++思想的必然结果复用,提高效率等等 如果你想使你的代码有可移植性,应使用stl。不过这都是狗P.我还真没见过把win32上的程序移植到linux上的考虑到运行效率,应该使用win32 API what STL? what Generic Programming? To: BoxFan(译作:饭盒?) STL = Standard Template LibraryGeneric Programming 简单点说就是重用吧?如,==运算符,int,float,char,string.....都可以 呵呵,给个例子,也许可以说明使用泛型可以省一点代码 ^_^这是我前不久遇到的一个问题,使用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;} UP.STL并不会使你的代码减少,只是写的代码少了.嗯.这应该说是C++的特性.唉.如果C语言也有重载就好了.那D语言好是好.却没有多少厂商支持.郁闷中.-_-# stl提供一系列的模板,可以减少你的工作量还有其中的一些基本的算法,使你不需要自己动手重新写 To:ming6424(大笨蛋100分)谢谢你的解释,我是知道的。我觉得搂住的问题应该是what STL? what Generic Programming?or how to use之类的。哈哈 “ ShaftWhy(归去来兮) :且据传,95%的程序员写出来的自己的专用的数据结构要比STL的低效。”具体问题具体分析。要不然还自己写算法干吗。也不能以棍子打死。越是通用的算法,越是不容易做到高效,越是特殊的算法,越是可以做到高效。有一些地方,矛盾不是速度,所以可以采用通用算法,可以大大减少工作量。但是,有一些地方速度很关键,那么采用通用算法就不合适了,必须深入研究,抓住问题的特殊性,来作针对性的优化算法,才能提高效率。 我下载了一个CxImage 要怎样使用他呢 对于一个程序,如何设置断点,然后一步步执行呢? 发泄一下! 怎么获得HBITMAP的像素格式, CListCtrl问题 一个很奇怪的问题,运行出错,求解? 如何获取输入的URL的IP 有谁用过大恒公司得DH-CG400得图像采集卡? WinPcap库下如何区分win98系统中的两块相同型号的网卡? 我也问个ListCtrl的小问题! 21bird 请看http://community.csdn.net/Expert/Forum.asp累计400分不够在给,help me 请问如何在程序启动时不创建子窗口?
stl里面有不少东西挺好的。
但是作界面,还是没办法。
本来界面这个东西,平台差异太大了。要想做到好的可移植性,太难。
可以举例吗?谢谢了
list
RbTreeMap
HashMap
Set
还有一些常用的算法。
GP就是牛,就是牛来就是牛。从最基础的意义和作用上讲,至少你不用自己去写链表集合之类的数据结构了。且据传,95%的程序员写出来的自己的专用的数据结构要比STL的低效。而从稍微深入一点儿,GP提供了policy-based的设计技术,使代码的复用达到一个相当的高度,而GP也使提供设计样式的模板成为可能。
建议看:
C++设计新思维:泛型编程与设计模式之应用
原书名:Modern C++ Design: Generic Programming and Design Patterns Applied
复用,提高效率等等
不过这都是狗P.我还真没见过把win32上的程序移植到linux上的
考虑到运行效率,应该使用win32 API
STL = Standard Template Library
Generic Programming 简单点说就是重用吧?如,==运算符,int,float,char,string.....都可以
这是我前不久遇到的一个问题,使用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;
}
还有其中的一些基本的算法,使你不需要自己动手重新写
谢谢你的解释,我是知道的。我觉得搂住的问题应该是what STL? what Generic Programming?
or how to use之类的。哈哈
越是通用的算法,越是不容易做到高效,越是特殊的算法,越是可以做到高效。
有一些地方,矛盾不是速度,所以可以采用通用算法,可以大大减少工作量。但是,有一些地方速度很关键,那么采用通用算法就不合适了,必须深入研究,抓住问题的特殊性,来作针对性的优化算法,才能提高效率。