??xml version="1.0" encoding="utf-8" standalone="yes"?>色偷偷偷久久伊人大杳蕉,理论片午午伦夜理片久久,久久亚洲AV成人无码电影 http://www.shnenglu.com/lovefeel2004/category/11592.html专注C/C++QLinux zh-cn Thu, 24 Jun 2010 07:36:45 GMT Thu, 24 Jun 2010 07:36:45 GMT 60 STL vector 容器介绍 http://www.shnenglu.com/lovefeel2004/archive/2010/06/23/118556.htmlq梦新媄 q梦新媄 Wed, 23 Jun 2010 05:56:00 GMT http://www.shnenglu.com/lovefeel2004/archive/2010/06/23/118556.html http://www.shnenglu.com/lovefeel2004/comments/118556.html http://www.shnenglu.com/lovefeel2004/archive/2010/06/23/118556.html#Feedback 0 http://www.shnenglu.com/lovefeel2004/comments/commentRss/118556.html http://www.shnenglu.com/lovefeel2004/services/trackbacks/118556.html 介绍
q篇文章的目的是Z介绍 std::vector Q如何恰当地使用它们的成员函数等操作。本文中q讨Z条g函数和函数指针在q代法中用,如在 remove_if() ?/span>for_each() 中的使用。通过阅读q篇文章读者应该能够有效地使用 vector 容器Q而且应该不会再去使用 C cd的动态数l了?/span>
Vector 总览
vector ?/span>C++ 标准模板库中的部分内容,它是一个多功能的,能够操作多种数据l构和算法的模板cd函数库?/span>vector 之所以被认ؓ是一个容器,是因为它能够像容器一样存攑U类型的对象Q简单地_ vector 是一个能够存放Q意类型的动态数l,能够增加和压~数据?/span>
Z可以使用 vector Q必d你的头文件中包含下面的代码:
vector 属于 std 命名域的Q因此需要通过命名限定Q如下完成你的代码:
using std::vector;
vector< int > vInts;
或者连在一P使用全名Q?/span>
使用全局的命名域方式Q?/span>
在后面的操作中全局的命名域方式会造成一些问题?/span>vector 容器提供了很多接口,在下面的表中列出 vector 的成员函数和操作?/span>
Vector 成员函数
函数
表述
c.assign(beg,end)
c.assign(n,elem)
?/span>[beg; end) 区间中的数据赋值给 c ?/span>
?/span>n ?/span>elem 的拷贝赋值给 c ?/span>
c.at(idx)
传回索引 idx 所指的数据Q如?/span>idx 界Q抛?/span>out_of_range ?/span>
c.back()
传回最后一个数据,不检查这个数据是否存在?/span>
c.begin()
传回q代器重的可一个数据?/span>
c.capacity()
q回容器中数据个数?/span>
c.clear()
U除容器中所有数据?/span>
c.empty()
判断容器是否为空?/span>
c.end()
指向q代器中的最后一个数据地址?/span>
c.erase(pos)
c.erase(beg,end)
删除 pos 位置的数据,传回下一个数据的位置?/span>
删除 [beg,end) 区间的数据,传回下一个数据的位置 ?/span>
c.front()
传回C个数据?/span>
get_allocator
使用构造函数返回一个拷贝?/span>
c.insert(pos,elem)
c.insert(pos,n,elem)
c.insert(pos,beg,end)
?/span>pos 位置插入一?/span>elem 拯Q传回新数据位置?/span>
?/span>pos 位置插入 n ?/span>elem 数据。无q回倹{?/span>
?/span>pos 位置插入?/span>[beg,end) 区间的数据。无q回倹{?/span>
c.max_size()
q回容器中最大数据的数量?/span>
c.pop_back()
删除最后一个数据?/span>
c.push_back(elem)
在尾部加入一个数据?/span>
c.rbegin()
传回一个逆向队列的第一个数据?/span>
c.rend()
传回一个逆向队列的最后一个数据的下一个位|?/span>
c.resize(num)
重新指定队列的长度?/span>
c.reserve()
保留适当的容量?/span>
c.size()
q回容器中实际数据的个数?/span>
c1.swap(c2)
swap(c1,c2)
?/span>c1 ?/span>c2 元素互换?/span>
同上操作?/span>
vector<Elem> c
vector <Elem> c1(c2)
vector <Elem> c(n)
vector <Elem> c(n, elem)
vector <Elem> c(beg,end)
c.~ vector <Elem>()
创徏一个空?/span>vector ?/span>
复制一?/span>vector ?/span>
创徏一?/span>vector Q含?/span>n 个数据,数据均已~省构造?/span>?/span>
创徏一个含?/span>n ?/span>elem 拯?/span>vector ?/span>
创徏一个以 [beg;end) 区间?/span>vector ?/span>
销毁所有数据,释放内存?/span>
Vector 操作
函数
描述
operator []
q回容器中指定位|的一个引用?/span>
创徏一?/span> vector
vector 容器提供了多U创建方法,下面介绍几种常用的?/span>
创徏一?/span>Widget cd的空?/span>vector 对象Q?/span>
vector<Widget> vWidgets;
// ------
// |
// |- Since vector is a container, its member functions
// operate on iterators and the container itself so
// it can hold objects of any type.
创徏一个包?/span>500 ?/span>Widget cd数据?/span>vector Q?/span>
vector<Widget> vWidgets(500);
创徏一个包?/span>500 ?/span>Widget cd数据?/span>vector Qƈ且都初始化ؓ 0 Q?/span>
vector<Widget> vWidgets(500, Widget(0));
创徏一?/span>Widget 的拷贝:
vector<Widget> vWidgetsFromAnother(vWidgets);
?/span> vector d一个数?/span>
vector d数据的缺省方法是 push_back() ?/span>push_back() 函数表示数据添加到 vector 的尾部,q按需要来分配内存。例如:?/span>vector<Widget> 中添?/span>10 个数据,需要如下编写代码:
for (int i= 0;i<10; i++)
vWidgets.push_back(Widget(i));
获取 vector 中制定位|的数据
很多时候我们不必要知道 vector 里面有多数据, vector 里面的数据是动态分配的Q?/span>push_back() 的一pd分配I间常常军_于文件或一些数据源。如果你想知?/span>vector 存放了多数据,你可以?/span>empty() 。获?/span>vector 的大,可以使用 size() 。例如,如果你想获取一?/span>vector v 的大,但不知道它是否ؓI,或者已l包含了数据Q如果ؓI想讄?/span>-1 Q你可以使用下面的代码实玎ͼ
int nSize = v.empty() ? -1 : static_cast < int >(v.size());
讉K vector 中的数据
使用两种Ҏ(gu)来访?/span>vector ?/span>
1?span> vector::at()
2?span> vector::operator[]
operator[] 主要是ؓ了与 C 语言q行兼容。它可以?/span>C 语言数组一h作。但 at() 是我们的首选,因ؓ at() q行了边界检查,如果讉K过?/span>vector 的范_抛Z个例外。由?/span>operator[] Ҏ(gu)造成一些错误,所有我们很用它,下面q行验证一下:
分析下面的代码:
vector< int > v;
v.reserve(10);
for ( int i=0; i<7; i++)
v.push_back(i);
try
{
int iVal1 = v[7]; // not bounds checked - will not throw
int iVal2 = v.at(7); // bounds checked - will throw if out of range
}
catch ( const exception& e)
{
cout << e.what();
}
我们使用 reserve() 分配?/span>10 ?/span>int 型的I间Q但q不没有初始化。如下图所C:
你可以在q个代码中尝试不同条Ӟ观察它的l果Q但是无Z时?/span>at() Q都是正的?/span>
删除 vector 中的数据
vector 能够非常Ҏ(gu)地添加数据,也能很方便地取出数据Q同?/span>vector 提供?/span>erase() Q?/span>pop_back() Q?/span>clear() 来删除数据,当你删除数据的时候,你应该知道要删除N的数据,或者是删除所有数据,q是个别的数据。在考虑删除{操作之前让我们静下来考虑一下在 STL 中的一些应用?/span>
Remove_if() 法
现在我们考虑操作里面的数据。如果要使用 remove_if() Q我们需要在头文件中包含如下代码Q:
Remove_if()有三个参敎ͼ
1?span>
iterator _First Q指向第一个数据的q代指针?/span>
2?span>
iterator _Last Q指向最后一个数据的q代指针?/span>
3?span>
predicate _Pred Q一个可以对q代操作的条件函数?/span>
条g函数
条g函数是一个按照用户定义的条gq回是或否的l果Q是最基本的函数指针,或者是一个函数对象。这个函数对象需要支持所有的函数调用操作Q重?/span>operator()() 操作?/span>remove_if() 是通过 unary_function l承下来的,允许传递数据作为条件?/span>
例如Q假如你想从一?/span>vector<CString> 中删除匹配的数据Q如果字串中包含了一个|从这个值开始,从这个值结束。首先你应该建立一个数据结构来包含q些数据Q类g码如下:
# include <functional>
enum findmodes
{
FM_INVALID = 0,
FM_IS,
FM_STARTSWITH,
FM_ENDSWITH,
FM_CONTAINS
};
typedef struct tagFindStr
{
UINT iMode;
CString szMatchStr;
} FindStr;
typedef FindStr* LPFINDSTR;
然后处理条g判断Q?/span>
class FindMatchingString
: public std::unary_function<CString, bool >
{
public :
FindMatchingString( const LPFINDSTR lpFS) : m_lpFS(lpFS) {}
bool operator()(CString& szStringToCompare) const
{
bool retVal = false ;
switch (m_lpFS->iMode)
{
case FM_IS:
{
retVal = (szStringToCompare == m_lpFDD->szMatchStr);
break ;
}
case FM_STARTSWITH:
{
retVal = (szStringToCompare.Left(m_lpFDD->szMatchStr.GetLength())
== m_lpFDD->szWindowTitle);
break ;
}
case FM_ENDSWITH:
{
retVal = (szStringToCompare.Right(m_lpFDD->szMatchStr.GetLength())
== m_lpFDD->szMatchStr);
break ;
}
case FM_CONTAINS:
{
retVal = (szStringToCompare.Find(m_lpFDD->szMatchStr) != -1);
break ;
}
}
return retVal;
}
private :
LPFINDSTR m_lpFS;
};
通过q个操作你可以从 vector 中有效地删除数据Q?/span>
// remove all strings containing the value of
// szRemove from vector<CString> vs.
FindStr fs;
fs.iMode = FM_CONTAINS;
fs.szMatchStr = szRemove;
vs.erase(std::remove_if(vs.begin(), vs.end(), FindMatchingString(&fs)), vs.end());
Remove_if() 能做什么?
你可能会疑惑Q对于上面那个例子在调用 remove_if() 的时候还要?/span>erase() 呢?q是因ؓ大家q不熟?zhn)?/span>STL 中的法?/span>Remove(),remove_if( ) {所有的Ud操作都是建立在一个P代范围上的,那么不能操作容器中的数据。所以在使用 remove_if() Q实际上操作的时容器里数据的上面的。思考上面的例子Q?/span>
1?span>
szRemove = “o”.
2?span> vs 见下面图表中的显C?br>
观察q个l果Q我们可以看?/span>remove_if() 实际上是Ҏ(gu)条g对P代地址q行了修改,在数据的后面存在一些残余的数据Q那些需要删除的数据。剩下的数据的位|可能不是原来的数据Q但他们是不知道的?/span>
调用 erase() 来删除那些残余的数据。注意上面例子中通过 erase() 删除 remove_if() 的结果和 vs.enc() 范围的数据?/span>
压羃一个臃肿的 vector
很多时候大量的删除数据Q或者通过使用 reserve() Q结?/span>vector 的空间远q大于实际需要的。所有需要压~?/span>vector 到它实际的大?/span>resize() 能够增加 vector 的大?/span>Clear() 仅仅能够改变~存的大,所有的q些对于 vector 释放内存{九(ji)非常重要了。如何来解决q些问题呢,让我们来操作一下?/span>
我们可以通过一?/span>vector 创徏另一?/span>vector 。让我们看看q将发生什么。假定我们已l有一?/span>vector v Q它的内存大ؓ 1000 Q当我们调用 size() 的时候,它的大小仅ؓ 7 。我们浪费了大量的内存。让我们在它的基上创Z?/span>vector ?/span>
std::vector<CString> vNew(v);
cout << vNew.capacity();
vNew.capacity() q回的是 7 。这说明新创建的只是Ҏ(gu)实际大小来分配的I间。现在我们不想释?/span>v Q因为我们要在其它地方用到它Q我们可以?/span>swap() ?/span>v ?/span>vNew 互相交换一下?
vNew.swap(v);
cout << vNew.capacity();
cout << v.capacity();
有趣的是Q?/span>vNew.capacity() ?/span>1000 Q?/span>?/span>v.capacity() ?/span>7 ?/span>
现在是达到我的目的了Q但是ƈ不是很好的解x法,我们可以像下面这么写Q?/span>
std::vector<CString>(v).swap(v);
你可以看到我们做了什么?我们创徏了一个时变量代曉K个命名的Q然后?/span>swap() , q样我们去掉了不必要的I间Q得到实际大的 v ?/span>
l论
我希望这个文可以给那些使用 STL vector 容器的开发者很有h(hun)值的参考。我也希望通过阅读q篇文章你可以放心地使用 vector 来代?/span>C 语言中的数据了?/span>
参?/span>
Plauger, P.J. Standard C++ Library Reference. February, 2003. MSDN.
Schildt, Herbert. C++ from the Ground Up, Second Edition. Berkeley : 1998.
Sutter, Herb. More Exceptional C++. Indianapolis : 2002.
]]>C++ STL~程L入门 http://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116947.htmlq梦新媄 q梦新媄 Tue, 01 Jun 2010 16:17:00 GMT http://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116947.html http://www.shnenglu.com/lovefeel2004/comments/116947.html http://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116947.html#Feedback 0 http://www.shnenglu.com/lovefeel2004/comments/commentRss/116947.html http://www.shnenglu.com/lovefeel2004/services/trackbacks/116947.html 作ؓC++标准不可~少的一部分QSTL应该是渗透在C++E序的角角落落里的。STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的Ȁ动h心ƈ非昙׃现。本教程旨在传播和普及STL的基知识Q若能借此Z为STL的推q做些力所能及的事情,C是g让h愉快的事情?span class=Apple-converted-space> 1 初识STLQ解{一些疑问 1.1 一个最兛_的问题:什么是STLU学领域里所常用的基本数据结构和基本法。ؓq大C++E序员们提供了一个可扩展的应用框Ӟ高度体现?a class=article style="FONT-SIZE: 14px; COLOR: rgb(0,0,255); WORD-BREAK: break-all; LINE-HEIGHT: 19px; TEXT-DECORATION: none" target=_blank>软g的可复用性。这U现象有些类gMicrosoft Visual C++中的MFCQMicrosoft Foundation Class LibraryQ,或者是Borland C++ Builder中的VCL(Visual Component Library)Q对于此二者,大家一定不会陌生吧?br style="WORD-BREAK: break-all"> "什么是STLQ?Q假如你对STLq知之甚,那么我想Q你一定很想知道这个问题的{案Q坦率地Ԍ要指望用短短数言这个问题阐q清楚,也决非易事。因此,如果你在看完本节之后q是觉得似懂非懂Q大可不必着急,在阅M后箋内容之后Q相信你对STL的认识,会愈加清晰、准和完整。不q,上述q番话听h是否有点像是在ؓ自己p糕的表达能力开q责呢Q?Q?span class=Apple-converted-space> 不知道你是否有过q样的经历。在你准备着手完成数据结构老师所布置的家庭作业时Q或者在你ؓ你所负责的某个Y仉目中d一Ҏ(gu)功能Ӟ你发现需要用C个链?List)或者是映射表(MapQ之cȝ东西Q但是手头ƈ没有现成的代码。于是在你开始正式考虑E序功能之前Q手工实现List或者Map是不可避免的。于?#8230;…Q最l你利完成了Q务。或许此Ӟ作ؓ一个具有较高素ȝE序员的你还不肯|休Q或者是一个喜Ƣ偷懒的优等?Q,因ؓ你会惛_Q如果以后还遇到q样的情冉|么办?没有必要再做一遍同L事情吧! 如果说上q这U情形每天都在发生,或许有点夸张。但是,如果说整个Y仉域里Q数十年来确实都在ؓ了一个目标而奋?-可复用性(reusabilityQ,q看hgq不夸张。从最早的面向q程的函数库Q到面向对象?a style="FONT-SIZE: 12px; COLOR: rgb(78,78,78); WORD-BREAK: break-all; TEXT-DECORATION: none" >E序设计思想Q到各种lg技术(如:COM、EJBQ,到设计模式(design patternQ等{。而STL也在做着cM的事情,同时在它背后蕴涵着一U新的程序设计思想--泛型化设计(generic programmingQ?span class=Apple-converted-space> l箋上面提到的那个例子,假如你把List或者map完好的保留了下来Q正在暗自得意。且慢,如果下一回的List里放的不是QҎ(gu)而是整数呢?如果你所实现的Map在效率上L令你不太满意q且有时q会Zbug呢?你该如何面对q些问题Q用STL是一个不错的选择Q确实如此,STL可以漂亮地解决上面提到的q些问题Q尽你q可以寻求其他方法?br> 说了半天Q到底STL是什么东西呢Q?span class=Apple-converted-space> STLQStandard Template LibraryQ,x准模板库Q是一个具有工业强度的Q高效的C++E序库。它被容U于C++标准E序库(C++ Standard LibraryQ中Q是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多?a class=article style="FONT-SIZE: 14px; COLOR: rgb(0,0,255); WORD-BREAK: break-all; LINE-HEIGHT: 19px; TEXT-DECORATION: none" target=_blank>计算?/a> 从逻辑层次来看Q在STL中体C泛型化程序设计的思想Qgeneric programmingQ,引入了诸多新的名词,比如像需求(requirementsQ,概念QconceptQ,模型QmodelQ,容器QcontainerQ,法QalgorithmnQ,q代子(iteratorQ等。与OOPQobject-oriented programmingQ中的多态(polymorphismQ一P泛型也是一U?a class=article style="FONT-SIZE: 14px; COLOR: rgb(0,0,255); WORD-BREAK: break-all; LINE-HEIGHT: 19px; TEXT-DECORATION: none" target=_blank>软g的复用技术?span class=Apple-converted-space> 从实现层ơ看Q整个STL是以一U类型参数化Qtype parameterizedQ的方式实现的,q种方式Z一个在早先C++标准中没有出现的语言Ҏ(gu)?-模板QtemplateQ。如果查阅Q何一个版本的STL源代码,你就会发玎ͼ模板作ؓ构成整个STL的基x一件千真万的事情。除此之外,q有许多C++的新Ҏ(gu)ؓSTL的实现提供了方便?span class=Apple-converted-space> 不知你对q里一下子冒出q么多术语做何感惻I希望不会另你不愉快。假如你对它们之中的大多C甚了解,敬请攑ֿQ在后箋内容中将会对q些名词逐一。正如开头所提到的?span class=Apple-converted-space> 有趣的是Q对于STLq有另外一U解?-STepanov & LeeQ前者是指Alexander StepanovQSTL的创始hQ而后者是Meng LeeQ她也是使STL得以推行的功臣,W一个STL成品是他们合作完成的。这一提法源自1995q?月,Dr.Dobb's Journal特约记? 著名技术书c作家Al Stevens对Alexander Stepanov的一专ѝ?span class=Apple-converted-space> 1.2 q根溯源QSTL的历史学院教授David Musser共同开发了一U叫做Tecton的语a。尽这ơ尝试最l没有取得实用性的成果Q但却给了Stepanov很大的启C?span class=Apple-converted-space> 在结识新朋友的时候,大多ChL忍不住想了解Ҏ(gu)的过厅R本节将带?zhn)单回一下STL的过厅R?span class=Apple-converted-space> 被誉为STL之父的Alexander StepanovQ出生于苏联莫斯U,早在20世纪70q代后半期,他便已经开始考虑Q在保证效率的前提下Q将法从诸多具体应用之中抽象出来的可能性,q便是后来泛型化思想的雏形。ؓ了验证自q思想Q他和纽U州立大学教授Deepak KapurQu塞里技?span class=Apple-converted-space> 在随后的几年中,他又和David Musser{h先后用Schema语言 Q一ULisp语言的变U)和Ada语言建立了一些大型程序库。这光QAlexander Stepanov开始意识到Q在当时的面向对象程序设计思想中所存在的一些问题,比如抽象数据cd概念所存在的缺陗Stepanov希望通过对Y仉域中各组成部分的分类Q逐渐形成一UY件设计的概念性框架?span class=Apple-converted-space> 1987q左叻I在贝实验室工作的Alexander Stepanov开始首ơ采用C++语言q行泛型软g库的研究。但遗憾的是Q当时的C++语言q没有引入模板(templateQ的语法Q现在我们可以清楚的看到Q模板概念之于STL实现Q是何等重要。是时Ӟ采用l承机制是别无选择的。尽如此,Stepanovq是开发出了一个庞大的法库。与此同Ӟ在与Andrew KoenigQ前ISO C++标准化委员会dQ和Bjarne StroustrupQC++语言的创始hQ等大师们的׃q程中,Stepanov开始注意到C/C++语言在实现其泛型思想斚w所h的潜在优ѝ就拿C/C++中的指针而言Q它的灵zM高效q用Q后来的STL在实现泛型化的同时更是保持了高效率。另外,在STL中占据极光要地位的q代子概念便是源自于C/C++中原生指针( native pointerQ的抽象?br> 1988q_Alexander Stepanov开始进?a class=article style="FONT-SIZE: 14px; COLOR: rgb(0,0,255); WORD-BREAK: break-all; LINE-HEIGHT: 19px; TEXT-DECORATION: none" target=_blank>惠普的Palo Alto实验室工作,在随后的4q中Q他从事的是有关盘 驱动器方面的工作。直?992q_׃参加q主持了实验室主任Bill Worley所建立的一个有关算法的研究目Q才使他重新回到了泛型化法的研I工作上来。项目自建立之后Q参与者从最初的8人逐渐减少Q最后只剩下两个?-Stepanove本h和Meng Lee。经q长旉的努力,最l,信念与汗水所换来的是一个包含有大量数据l构和算法部件的庞大q行库。这便是现在的STL的雏形(同时也是STL的一个实现版?-HP STLQ?span class=Apple-converted-space> 1993q_当时在贝实验室的Andrew Koenig看到了Stepanove的研I成果,很是兴奋。在他的鼓励与帮助下QStepanove于是q?月的圣何塞ؓANSI/ISO C++标准委员会做了一个相xԌ题ؓ"The Science of C++ Programming"Q,向委员们讲述了其观念。然后又于次q?月,在圣q戈会议上,向委员会提交了一份徏议书Q以期STL成ؓC++标准库的一部分。尽这一十分庞大Q以至于降低了被通过的可能性,但由于其所包含的新思想Q投结果以压倒多数的意见认ؓ推迟对该的决定?span class=Apple-converted-space> 随后Q在众h的帮助之下,包括Bjarne Stroustrup在内QStepanove又对STLq行了改q。同时加入了一个封装内存模式信息的抽象模块Q也是现在STL中的allocatorQ它使STL的大部分实现都可以独立于具体的内存模式,从而独立于具体q_。在同年夏季的滑铁卢会议上,委员们以80%赞成Q?0%反对Q最l通过了提案,军_STL正式U_C++标准化进E之中,随后STL便被放进了会议的工作文g中。自此,STLl于成ؓ了C++家族中的重要一员?span class=Apple-converted-space> 此后Q随着C++标准的不断改q,STL也在不断C着相应的演化。直?998q_ANSI/ISO C++标准正式定案QSTL始终是C++标准中不可或~的一大部件?span class=Apple-converted-space> 1.3 千丝万缕的联pR 1.3.1 STL和C++ 1.3.2 STL和C++标准函数?.3.3 STL和GPQGP和OOP 1.4 STL的不同实现版本 1.4.1 HP STL 1.4.2 P.J. Plauger STLhttp://www.dinkumware.comVisualStudiohashset容器?.4.3 Rouge Wave STLhttp://www.rougewave.com源代码C:Program Files\Borland\Cbuilder6\Include\oldstlQ?.4.4 STLporthttp://www.stlport.org免费下蝲VC中的STL要快。比Rouge Wave STL更符合标准,也更Ҏ(gu)UL。Borland C++ Builder已经在其6.0版中加入了对STLport的支持,它用的STLport是4.5版的QC++ Builder 6.0同时q提供了STLport的用说明。你可以在C++ Builder的Include\Stlport子目录下扑ֈ所有头文gQ比如:C:\Program Files\Borland\Cbuilder6\Include\StlportQ?.4.5 SGI STLhttp://www.sgi.com新版本是3.3?span class=Apple-converted-space> 在你了解了STL的过M后,一些名词开始不断在你的大脑中Q玎ͼSTL、C++、C++标准函数库、泛型程序设计、面向对象程序设?#8230;…Q这些概忉|味着什么?他们之间的关pd是什么?如果你想了解某些l节Q这里也许有你希望得到的{案?span class=Apple-converted-space> 没有C++语言没有STLQ这么说毫不。一般而言QSTL作ؓ一个泛型化的数据结构和 此外QSTL对于C++的发展,其是模板机Ӟ也vC促进作用。比如:模板函数的偏特化Qtemplate function partial specializationQ,它被用于在特定应用场合,Z般模板函数提供一pdҎ(gu)化版本。这一Ҏ(gu)是lSTL被ANSI/ISO C++标准委员会通过之后Q在Bjarne和Stepanov共同商讨之下q由Bjarne向委员会提出的,最l该徏议被通过。这使得STL中的一些算法在处理Ҏ(gu)情Ş时可以选择非一般化的方式,从而保证了执行的效率?span class=Apple-converted-space> STL是最新的C++标准函数库中的一个子集,q个庞大的子集占据了整个库的大约80%的分量。而作为在实现STLq程中扮演关键角色的模板则充斥了几乎整个C++标准函数库。在q里Q我们有必要看一看C++标准函数库里包含了哪些内容,其中又有哪些是属于标准模板库Q即STLQ的?span class=Apple-converted-space> C++标准函数库ؓC++E序员们提供了一个可扩展的基性框架。我们从中可以获得极大的便利Q同时也可以通过l承现有c,自己~制W合接口规范的容器、算法、P代子{方式对之进行扩展。它大致包含了如下几个组Ӟ C标准函数库,基本保持了与原有C语言E序库的良好兼容Q尽有些微变化。h们M忍不住留恋过ȝ好岁月Q如果你曄是一个CE序员,对这一点一定体会颇深。或许有一点会让你觉得奇怪,那就是在C++标准库中存在两套C的函数库Q一套是带有.h扩展名的Q比?stdio.h style="WORD-BREAK: break-all">Q,而另一套则没有Q比?cstdio style="WORD-BREAK: break-all">Q。它们确实没有太大的不同?span class=Apple-converted-space> 语言支持Qlanguage supportQ部分,包含了一些标准类型的定义以及其他Ҏ(gu)的定义Q这些内容,被用于标准库的其他地Ҏ(gu)是具体的应用E序中?span class=Apple-converted-space> 诊断QdiagnosticsQ部分,提供了用于程序诊断和报错的功能,包含了异常处理(exception handlingQ,断言QassertionsQ,错误代码Qerror number codesQ三U方式?span class=Apple-converted-space> 通用工具Qgeneral utilitiesQ部分,q部分内容ؓC++标准库的其他部分提供支持Q当然你也可以在自己的程序中调用相应功能。比如:动态内存管理工P日期/旉处理工具。记住,q里的内容也已经被泛化了Q即采用了模板机Ӟ?span class=Apple-converted-space> 字符ԌstringQ部分,用来代表和处理文本。它提供了够丰富的功能。事实上Q文本是一个string对象Q它可以被看作是一个字W序列,字符cd可能是charQ或者wchar_t{等。string可以被{换成char*cdQ这样便可以和以前所写的C/C++代码 和^共处了。因为那时侯除了char*Q没有别的?span class=Apple-converted-space> 国际化(internationalizationQ部分,作ؓOOPҎ(gu)之一的封装机制在q里扮演着消除文化和地域差异的角色Q采用locale和facet可以为程序提供众多国际化支持Q包括对各种字符集的支持Q日期和旉的表C,数值和货币的处理等{。毕竟,在中国和在美国,Z表示日期的习惯是不同的?span class=Apple-converted-space> 容器QcontainersQ部分,STL的一个重要组成部分,늛了许多数据结构,比如前面曄提到的链表,q有QvectorQ类g大小可动态增加的数组Q、queueQ队列)、stackQ堆栈)……。string也可以看作是一个容器,适用于容器的Ҏ(gu)同样也适用于string。现在你可以L的完成数据结构课E的家庭作业了?br> 法QalgorithmsQ部分,STL的一个重要组成部分,包含了大U?0个通用法Q用于操控各U容器,同时也可以操控内建数l。比如:find用于在容器中查找{于某个特定值的元素Qfor_each用于某个函数应用到容器中的各个元素上,sort用于对容器中的元素排序。所有这些操作都是在保证执行效率的前提下q行的,所以,如果在你使用了这些算法之后程序变得效率底下,首先一定不要怀疑这些算法本w,仔细查一下程序的其他地方?span class=Apple-converted-space> q代器(iteratorsQ部分,STL的一个重要组成部分,如果没有q代器的撮合Q容器和法便无法结合的如此完美。事实上Q每个容器都有自qq代器,只有容器自己才知道如何访问自q元素。它有点像指针,法通过q代器来定位和操控容器中的元素?span class=Apple-converted-space> 数|numericsQ部分,包含了一些数学运功能,提供了复数运的支持?span class=Apple-converted-space> 输入/输出Qinput/outputQ部分,是l过模板化了的原有标准库中的iostream部分Q它提供了对C++E序输入输出的基本支持。在功能上保持了与原有iostream的兼容,q且增加了异常处理的机制Qƈ支持国际化(internationalizationQ?span class=Apple-converted-space> M上,?a style="FONT-SIZE: 12px; COLOR: rgb(78,78,78); WORD-BREAK: break-all; TEXT-DECORATION: none" >C++标准函数库中QSTL主要包含了容器、算法、P代器。string也可以算做是STL的一部分?span class=Apple-converted-space> 正如前面所提到的,在STL的背后蕴含着泛型化程序设计(GPQ的思想Q在q种思想里,大部分基本算法被抽象Q被泛化Q独立于与之对应的数据结构,用于以相同或相近的方式处理各U不同情形。这一思想和面向对象的E序设计思想QOOPQ不相同,因ؓQ在OOP中更注重的是Ҏ(gu)据的抽象Q即所谓抽象数据类型(Abstract Data TypeQ,而算法则通常被附属于数据cd之中。几乎所有的事情都可以被看作cL者对象(即类的实例)Q通常Q我们所看到的算法被作ؓ成员函数Qmember functionQ包含在c(classQ中Q类和类则构成了错综复杂的承体pR?span class=Apple-converted-space> 管在象C++q样的程序设计语a中,你还可以用全局函数来表C算法,但是在类gJavaq样的纯面向对象的语a中,全局函数已经?勒o止"了。因此,用Java来模拟GP思想是颇为困隄。如果你对前q的STL历史q有印象的话Q应该记得Alexander Stepanove也曾用基于OOP的语a试q实现GP思想Q但是效果ƈ不好Q包括没有引入模板之前的C++语言。站在巨人的肩膀上,我们可以得出q样的结论,在OOP中所体现的思想与GP的思想实是相异的。C++q不是一U纯面向对象的程序设计语aQ它的绝妙之处,在于既满了OOPQ又成全了GP。对于后者,模板立下了汗马功功뀂另外,需要指出的是,管GP和OOP有诸多不同,但这U不同还不至于到"水火不容"的地步。ƈ且,在实际运用的时候,两者的l合使用往往可以佉K题的解决更ؓ有效。作为GP思想实例的STL本n便是一个很好的范例Q如果没有承,不知道STL会是什么样子,g没有人做q这L试验?br> 怿你对STL的感性认识应该有所提高了,是该做一些实际的工作了,那么我们首先来了解一下STL的不同实现版本。ANSI/ISO C++文g中的STL是一个仅被描q在U怸的标准,对于诸多C++~译器而言Q需要有各自实际的STLQ它们或多或的实现了标准中所描述的内容,q样才能够ؓ我们所用。之所以有不同的实现版本,则存在诸多原因,有历史的原因Q也有各自编译器生厂商的原因。以下是几个常见的STL实现版本?span class=Apple-converted-space> HP STL是所有其它STL实现版本的根源。它是STL之父Alexander Stepanov?a class=article style="FONT-SIZE: 14px; COLOR: rgb(0,0,255); WORD-BREAK: break-all; LINE-HEIGHT: 19px; TEXT-DECORATION: none" target=_blank>惠普的Palo Alto实验室工作时Q和Meng Lee共同完成的,是第一个STL的实现版本(参见1.2节)。这个STL是开放源码的Q所以它允许M人免费用、复制、修攏V发布和销售该软g 和相x档,前提是必d所有相x件中加入HP STL的版本信息和授权信息。现在已l很直接用这个版本的STL了?span class=Apple-converted-space> P. J. Plauger STL属于个h作品Q由P. J. Plauger本h实现Q是HP STL的一个承版本,因此在其所有头文g中都含有HP STL的相兛_明,同时q有P. J. Plauger本h的版权声明。P. J. Plauger是标准C中stdio库的早期实现者,现在是C/C++ User's Journal的主~,与Microsoft保持着良好的关pRP. J. Plauger STL便是被用于Microsoft的Visual C++中的。在Windowsq_下的同类版本中,其性能不错Q但是queuelgQ队列,一U容器)的效率不理想Q同时由于Visual C++对C++语言标准的支持不是很好(臛_直到VC6.0为止Q还是如此)Q因此一定程度上影响了P. J. Plauger STL的性能。此外,该版本的源代码可L较差,你可以在VC的Include子目录下扑ֈ所有源文gQ比如:C:\Program Files\Microsoft Visual Studio\VC98\IncludeQ。因Z是开放源码的Qopen sourceQ,所以这?a style="FONT-SIZE: 12px; COLOR: rgb(78,78,78); WORD-BREAK: break-all; TEXT-DECORATION: none" >源代?/a>是不能修改和销售的Q目前P.J. Plauger STL由Dinkumware公司提供相关服务. Rouge Wave STL是由Rouge Wave公司实现的,也是HP STL的一个承版本,除了HP STL的相兛_明之外,q有Rouge Wave公司的版权声明。同Ӟ它也不是开放源码的Q因此无法修改和销售。该版本被Borland C++ Builder所采用Q你可以在C++ Builder的Include子目录下扑ֈ所有头文gQ比如:C:\Program Files\Borland\Cbuilder5\IncludeQ。尽Rouge Wave STL的性能不是很好Q但׃C++ Builder对C++语言标准的支持还不错,使其表现在一定程度上得以改善。此外,其源代码的可L较好。可以从如下|站得到更详l的情况介绍Q?span class=Apple-converted-space> STLport最初源于俄国hBoris Fomitchev的一个开发项目,主要用于SGI STL的基本代码移植到其他诸如C++Builder或者是Visual C++q样的主编译器上。因为SGI STL属于开放源码,所以STLport才有权这样做。目前STLport的最新版本是4.5。可以从如下|站得到更详l的情况介绍Q?span class=Apple-converted-space> SGI STL是由Silicon Graphics Computer System, Inc公司实现的,其设计者和~写者包括Alexander Stepanov和Matt AusternQ同样它也是HP STL的一个承版本。它属于开放源码,因此你可以修改和销售它。SGI STL被GCCQlinux下的C++~译器)所采用Q你可以在GCC的Include子目录下扑ֈ所有头文gQ比如:C:\cygnus\cygwin-b20\include\g++\includeQ。由于GCC对C++语言标准的支持很好,SGI STL在linuxq_上的性能相当。此外,其源代码的可L也很好?/span>
]]>C++cdQOTL通用的数据库q接cd http://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116946.htmlq梦新媄 q梦新媄 Tue, 01 Jun 2010 16:05:00 GMT http://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116946.html http://www.shnenglu.com/lovefeel2004/comments/116946.html http://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116946.html#Feedback 0 http://www.shnenglu.com/lovefeel2004/comments/commentRss/116946.html http://www.shnenglu.com/lovefeel2004/services/trackbacks/116946.html
OTL是一个纯C++的通用数据库连接模板库Q可以支持各U当下流行的数据库,如OracleQSybase, MySQL, PostgreSQL, EnterpriseDB, SQLite, MS ACCESS, Firebird{等.它是一个跨q_cdQ在MS Windows, Linux/Unix/Mac OS X 都可以用?/p>
下蝲|址Q?font style="WORD-BREAK: normal; LINE-HEIGHT: 19px; WORD-WRAP: normal" size=2>http://otl.sourceforge.net/
OTL使用? 只要头文件中包含? #include "otlv4.h " 可Q实际上整个OTL׃?H的文Ӟ使用h极ؓ的方ѝ?/span>
OTL使用Ҏ(gu)Q?/p>
1、首先指定要q接的数据库cdQOTL?font style="WORD-BREAK: normal; LINE-HEIGHT: 19px; WORD-WRAP: normal" size=2>宏定?/font>来指定要q接的数据库cd?font style="WORD-BREAK: normal; LINE-HEIGHT: 19px; WORD-WRAP: normal" size=2>OTL 会根据这个宏定义来初始化数据库连接的环境?/span>
相关的宏定义列表 http://otl.sourceforge.net/otl3_compile.htm
如: #define OTL_ORA8I 表示q接Oracle 8i 数据库?/p>
2、例?/span>
#include <iostream> using namespace std; #include <stdio.h>
#define OTL_ORA8I // 指定q接的数据库cd #include <otlv4.h> // include the OTL 4 header file
otl_connect db; // 定义数据库实?/span>
void insert() // d记录
{ otl_stream o(50, // buffer size "insert into test_tab values(:f1<float>,:f2<char[31]>)", // SQL statement db // connect object ); char tmp[32];
for(int i=1;i<=100;++i){ #if defined(_MSC_VER) #if (_MSC_VER >= 1400) // VC++ 8.0 or higher sprintf_s(tmp,sizeof(tmp),"Name%d",i); #else sprintf(tmp,"Name%d",i); #endif #else sprintf(tmp,"Name%d",i); #endif o<<static_cast<float>(i)<<tmp; } }
//查询记录
void select() { otl_stream i(50, // buffer size "begin " " open :cur1 for " " select * from test_tab " " where f1>=:f<int> and f1<=:f*2; " "end;", // SELECT statement via referenced cursor db, // connect object ":cur1" // referenced cursor placeholder name ); // create select stream otl_column_desc* desc; int desc_len;
i<<4; // Before the child SELECT statement can be described, // the PL/SQL master block needs to be executed. // Forcing the execution of the blcok by entering its input // patameter.
desc=i.describe_select(desc_len);
for(int n=0;n<desc_len;++n){ cout<<"========== COLUMN #"<<n+1<<" ==========="<<endl; cout<<"name="<<desc[n].name<<endl; cout<<"dbtype="<<desc[n].dbtype<<endl; cout<<"otl_var_dbtype="<<desc[n].otl_var_dbtype<<endl; cout<<"dbsize="<<desc[n].dbsize<<endl; cout<<"scale="<<desc[n].scale<<endl; cout<<"prec="<<desc[n].prec<<endl; cout<<"nullok="<<desc[n].nullok<<endl; }
}
int main() { otl_connect::otl_initialize(); // 初始化Oracle环境 try{
db.rlogon("scott/tiger"); // q接Oracle
otl_cursor::direct_exec ( db, "drop table test_tab", otl_exception::disabled // disable OTL exceptions ); // drop table
otl_cursor::direct_exec ( db, "create table test_tab(f1 number, f2 varchar2(30))" ); // create table
insert(); select();
}
catch(otl_exception& p){ // intercept OTL exceptions cerr<<p.msg<<endl; // print out error message cerr<<p.stm_text<<endl; // print out SQL that caused the error cerr<<p.var_info<<endl; // print out the variable that caused the error }
db.logoff(); //断开数据库连?/span>
return 0;
}
]]>boost库linux~译安装 http://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116943.htmlq梦新媄 q梦新媄 Tue, 01 Jun 2010 15:36:00 GMT http://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116943.html http://www.shnenglu.com/lovefeel2004/comments/116943.html http://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116943.html#Feedback 0 http://www.shnenglu.com/lovefeel2004/comments/commentRss/116943.html http://www.shnenglu.com/lovefeel2004/services/trackbacks/116943.html 相对于Windows来,Linux下的boost~译单至极。没有那么多的可选编译器Q没有那长的~译旉Q没有那么多的硬盘用量Q统一的inlude和lib目录Q你熟?zhn)命o行,不用IDEQ不需要我那么|嗦的介l怎么配置EditPlus?br> 首先是下载boostQ可以在?
http://sourceforge.net/projects/boost
L一个合适的版本。比如我下蝲的是boost_1_33_1.tar.gzQ解压到/opt?br>
tar xzvf boost_1_33_1.tar.gz -C/opt
提醒Q做q些事情的时候你需要有root权限?br> q入boost目录Q?br>
cd /opt/boost_1_33_1
首先我们要编译bjamQ?br>
cd tools/build/jam_src/ ./build.sh
很快~译l束Q默认情况下Qbjam会被复制?usr/local/bin/bjam?br> 现在你可以用bjam~译boost了?br>
cd ../../.. bjam -sTOOLS=gcc install
~译旉不会如windows那么长久Q在我的?sh)脑上编译了大?0分钟。你可以在前后用df命o查下盘使用Q在我的?sh)脑上,~译boostp?00M的空间?br> 使用install会把头文件复制到/usr/local/include/boost-1_33_1中,把生成的lib复制?usr/local/lib中。这些完成之后,记得要用ldconfig来更新动态链接库?br> 在测试两个例子之前,我们先设|几个环境变量?br>
BOOST_ROOT=/opt/boost_1_33_1 BOOST_INCLUDE=/usr/local/include/boost-1_33_1 BOOST_LIB=/usr/local/lib
Z使其能够在登录时自动导入Q你可以写一个脚本:
#!/bin/sh #boost settings BOOST_ROOT=/opt/boost_1_33_1 BOOST_INCLUDE=/usr/local/include/boost-1_33_1 BOOST_LIB=/usr/local/lib export BOOST_ROOT BOOST_INCLUDE BOOST_LIB
其保存?etc/profile.d/boost.shQƈ使用chmod a+x boost.sh讄执行权限?br> 现在我们可以写两D代码来试了?br> W一个测试文件是lex.cppQ?br>
#include <boost/lexical_cast.hpp> #include <iostream> int main() { using boost::lexical_cast; int a = lexical_cast<int>("123"); double b = lexical_cast<double>("123.12"); std::cout<<a<<std::endl; std::cout<<b<<std::endl; return 0; }
~译Q?br>
g++ lex.cpp -I$BOOST_ROOT -o lex
q行Q?br>
./lex
输出Q?br>
123 123.12
你可以将$BOOST_ROOT改ؓ$BOOST_INCLUDEQ如果你没有讄环境变量Q可以改?opt/boost_1_33_1或?usr/local/include/boost-1_33_1?br> 我们的第二个例子是re.cppQ?br>
#include <iostream> #include <string> #include <boost/regex.hpp> int main() { std::string s = "who,lives:in-a,pineapple under the sea?"; boost::regex re(",|:|-|\\s+"); boost::sregex_token_iterator p(s.begin( ), s.end( ), re, -1); boost::sregex_token_iterator end; while (p != end) std::cout << *p++ << '\n'; }
~译Q?br>
g++ re.cpp -I$BOOST_ROOT -lboost_regex-gcc -o re
q行Q?br>
./re
输出Q?br>
who lives in a pineapple under the sea?
q里要?l指定了链接库?br> 现在boost的基本安装配|已l完成,但是我们可以再改q下?br> 如果不想每次都指定boost头文件目录,可以其link?usr/include中:
ln -s /opt/boost_1_33_1/boost /usr/include/boost
或者:
ln -s /usr/local/include/boost-1_33_1/boost /usr/include/boost
如果你依然嫌boost~译后占用的I间太大Q可以在boost目录下用bjam cleanQ?br>
cd /opt/boost_1_33_1 bjam -sTOOLS=gcc clean
q个命o会清除编译时的中间文Ӟ/usr/local/lib下带版本Lboost libsQ和/usr/local/include下的boost头文件。但是同时节省了几百M的硬盘空间?br> 所以如果你使用了cleanQ记得将BOOST_INCLUDE更ؓBOOST_ROOTQ?opt/boost_1_33_1Q,?/usr/include/boost link?opt/boost_1_33_1/boostQ再有就是编译链接时的boost lib不要带版本号?br> 如果你觉得编译时手动链接敲那么长的名字比较麻烦,可以使用脚本来自动寻N接:
#!/usr/bin/python import os import sys import re BOOST_ROOT = os.getenv('BOOST_ROOT') BOOST_LIB = os.getenv('BOOST_LIB') #BOOST_ROOT = '/opt/boost_1_33_1' #BOOST_LIB = '/usr/local/lib' def getlibs(): alls = os.listdir(BOOST_LIB) libpattern = re.compile(r'^libboost_([^-]+)-gcc') libs = {} for lib in alls: m = libpattern.match(lib) if m: libs[m.group(1).lower()] = 1 return libs pattern = re.compile(r'^\s*#include\s*<\s*boost/(.+)\.(h|hpp)\s*>') libs = getlibs() libskeys = libs.keys() includes = {} ENV = os.environ ARGV = sys.argv[1:] files = ARGV if len(files) == 0: sys.exit() for f in files: if f.lower().endswith('.cpp'): fp = open(f, 'r') lines = fp.readlines() for ln in lines: m = pattern.match(ln) if m: libname = m.group(1).lower() if libname in libskeys: includes[libname] = 1 libline = ' '.join(map(lambda lib: '-lboost_'+lib+'-gcc', includes.keys())) obj = ARGV[0] obj = obj[:len(obj)-4] #cmd = 'g++ %s -I%s %s -o %s' % (' '.join(files), BOOST_ROOT, libline, obj) cmd = 'g++ %s %s -o %s' % (' '.join(files), libline, obj) print cmd os.system(cmd)
这D代码写q?usr/local/bin/gccboostQ赋予执行权限?br> 使用Ҏ(gu)Q?br>
gccboost lex.cpp gccboost re.cpp
注意Q用此命o假设boost头文件在/usr/include中,如果假设不成立,误行修改脚本此行:
cmd = 'g++ %s %s -o %s' % (' '.join(files), libline, obj)
Z前的注释行:
cmd = 'g++ %s -I%s %s -o %s' % (' '.join(files), BOOST_ROOT, libline, obj)
如若BOOST_ROOT和BOOST_LIB环境变量不存在,修改下面两行代码Q?br>
BOOST_ROOT = os.getenv('BOOST_ROOT') BOOST_LIB = os.getenv('BOOST_LIB')
Z后注释行Q?br>
BOOST_ROOT = '/opt/boost_1_33_1' BOOST_LIB = '/usr/local/lib'
另外Qgccboost会自动修改输出的文件名?.cpp的文件名Q如lex.cpp输出lexQ,如果不需要,请将下面的代码:
cmd = 'g++ %s %s -o %s' % (' '.join(files), libline, obj)
改ؓQ?br>
cmd = 'g++ %s %s' % (' '.join(files), libline)
Boost安装历程x基本l束?/span>
]]>在Linuxpȝ中安装和配置ACE(? http://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116942.htmlq梦新媄 q梦新媄 Tue, 01 Jun 2010 15:31:00 GMT http://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116942.html http://www.shnenglu.com/lovefeel2004/comments/116942.html http://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116942.html#Feedback 0 http://www.shnenglu.com/lovefeel2004/comments/commentRss/116942.html http://www.shnenglu.com/lovefeel2004/services/trackbacks/116942.html
本文详细描述了在Linux操作pȝ上安装和配置“自适应通信环境(ACE)”的过E和注意事项?br>文中的描q基于RedHat Linux 9操作pȝ和ACE 5.4?/p>
准备工作Q?
1.保你的Linux操作pȝ的开发环?gcc、make……)是完整且可用的?br>2.在安装ACE的过E中Q可能需要root权限Q因此确保你拥有root帐户的密码?br>3.对于典型的Redhat9pȝQautoconfE序的版本可能过低,你需要首先升U它?
升的步骤如下:
1.在控制台中输?autoconf -VQ查看你的autoconfE序的版?br>2.如果低于2.57gQ你需要到http://www.gnu.org/software/autoconf/ M载最新版本的autoconfE序Q目前autoconfE序的版本是2.59 3.Ҏ(gu)tarball中的安装说明Q编译ƈ安装升autoconfE序 开始安装:
l过上面的准备工作,现在你已l具备了安装ACE的条件。下面开始正式的安装工作?
1.首先定ACE的安装\径,q徏立相应的目录?br>q里Q我们把ACE安装?home/zhc/ace/的目录下Q先执行 mkdir /home/zhc/ace 2.然后获得的ACE源代码包解至该目录下?br>tar zxvf ACE-5.4.tar.gz /home/zhc/ace 3.q时Q在ace的目录下会徏立一个名为ACE_wrappers的子目录QACE所有的源代码、工兗和例子都在q个目录中?br>先进入该目录Q执?br>cd /home/zhc/ace/ACE_wrappers 然后建立一个子目录Q用于存放ACE~译后的目标文g mkdir build cd build 4.接着,执行configure脚本Q检查你的系l环境,配置q生成适合你的pȝ的Makefile文g?br>在执行configure脚本Ӟ可以加入许多配置选项Q其详细说明可以参看ACE_wrappers目录下的ACE-INSTALL.html文gQ?br>对于Redhat9pȝ来说Q不必加M参数QACE可以很好的工作了?br>../configure 5.在O长的查和配置之后Q如果没有什么问题,你就可以开始编译了Q如果要让ace支持ICMP 和对c++库的支持Q需要在config.h头文件中加上#define ACE_HAS_STANDARD_CPP_LIBRARY 1 ?define ACE_HAS_ICMP_SUPPORT 1Q?br>q一步很单,执行 make 然后Q一杯茶Q静静的{待p了?br>6.如果~译利的通过(通常都会是这L)Q那么恭喜你Q你已经成功了一大半了,下面要做的仅仅是以些配置工作而已?br>接下来的工作是安装,q一步是可选的Q目的是把编译生成的ACE的库文g、头文g和手册页{安装到/usr/local的相应目录中去,Z今后使用的方便,我徏议你q是q行q一步,执行 su root's password make install 7.安装之后Q我们就可以q行最后的配置工作了?br>首先讄环境变量ACE_ROOTQ执?br>setenv ACE_ROOT /home/zhc/ace/ACE_wrappers 注意其中的\径要Ҏ(gu)你的实际情况而定 如果你不xơ都手工讑֮路径Q可以编辑你的bash的配|文Ӟ执行 cd vi .bash_profile 在其中填加如下两?br>ACE_ROOT=/home/work/research/ace/ACE_wrappers export ACE_ROOT 8.然后Q在$ACE_ROOT/ace目录中创Z个名为config.h的文Ӟ在其中包含如下一?br>#include "ace/config-linux.h" 或者,单v见,你也可以直接建立一个指向config-linux.h的符号链接,执行 ln -s config-linux.h config.h 9.同样Q在$ACE_ROOT/include/makeinclude目录中创Z个名为platform_macros.GNU的文Ӟ在其中包含如下一?br>include $(ACE_ROOT)/include/makeinclude/platform_linux.GNU 或者,单v见,你也可以直接建立一个指向platform_linux.GNU的符号链接,执行 ln -s platform_linux.GNU platform_macros.GNU 10.最后一步,讄环境变量LD_LIBRARY_PATHQ执?br>setenv LD_LIBRARY_PATH $ACE_ROOT/ace:$ACE_ROOT/lib: /usr/local/lib:$LD_LIBRARY_PATH 或者在~/.bash_profile文g中添加如下两?br>LD_LIBRARY_PATH=$ACE_ROOT/ace:$ACE_ROOT/lib: /usr/local/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH 安装完成Q?
l过上面的步骤,ACE已经安装C(zhn)的pȝ上了Q下面我们将~译q执行ACE的例E以验证我们的工作?br>q里我们以《C++|络~程Q卷一》所带的例子Z?
1:q入例程目录Q执?br>cd $(ACE_ROOT)/examples/C++NPv1 2:~译例子E序Q执?br>make 如果前面的安装和配置正确Q很快就能够得到~译后的例子E序?br>3:分别执行一个服务器E序(随便哪一个都?和一个客LE序(Logging_Client)Q如果程序运行正,说明前面的安装和配置成功Q下面你可以开始你的ACE学习之旅?/span>
]]>
þƵ |
99þ99ֻѵľƷ |
þþƷһ |
þþþ99ƷƬëƬ
|
˾þ뾫ƷĻ |
Ʒþþþþù |
þó˾ƷƵ |
ŷԴսþþþþ |
ŷ츾XXXXԾþþ |
þԭƷ |
һһþaþþƷۺ
|
Ʒһþ㽶߿ۿ |
ƷŮþþþavˬ
|
Ʒþþ |
þþƷ |
˾þô߽AVһ |
97þùƷ
|
Ʒһþ㽶߿ |
Ʒþһ |
ĻhdþþƷ
|
þ۲ӰԺѿҹɫ |
ھƷþ
|
˾þþƷһ |
þպƬ |
þþƷƷŷ |
һþþƷ |
777ҹƷþav |
һɫþۺϺݺƪ
|
ձ츾þþþþ |
Ʒþþž |
˺ݺۺϾþ88 |
ھƷþþþӰԺձ |
ɫþþۺ |
þݺҹҹ
|
˾þˬ |
ɫWWWþվ |
ٸþ |
þþƷһ99 |
þþùƷһ |
þþþƷһ
|
þ۲ӰԺѿҹɫ |