??xml version="1.0" encoding="utf-8" standalone="yes"?>色偷偷偷久久伊人大杳蕉,理论片午午伦夜理片久久,久久亚洲AV成人无码电影http://www.shnenglu.com/lovefeel2004/category/11592.html专注C/C++QLinuxzh-cnThu, 24 Jun 2010 07:36:45 GMTThu, 24 Jun 2010 07:36:45 GMT60STL vector 容器介绍http://www.shnenglu.com/lovefeel2004/archive/2010/06/23/118556.htmlq梦新媄q梦新媄Wed, 23 Jun 2010 05:56:00 GMThttp://www.shnenglu.com/lovefeel2004/archive/2010/06/23/118556.htmlhttp://www.shnenglu.com/lovefeel2004/comments/118556.htmlhttp://www.shnenglu.com/lovefeel2004/archive/2010/06/23/118556.html#Feedback0http://www.shnenglu.com/lovefeel2004/comments/commentRss/118556.htmlhttp://www.shnenglu.com/lovefeel2004/services/trackbacks/118556.html介绍

q篇文章的目的是Z介绍std::vectorQ如何恰当地使用它们的成员函数等操作。本文中q讨Z条g函数和函数指针在q代法中用,如在remove_if()?/span>for_each()中的使用。通过阅读q篇文章读者应该能够有效地使用vector容器Q而且应该不会再去使用Ccd的动态数l了?/span>

 

Vector总览

vector?/span>C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据l构和算法的模板cd函数库?/span>vector之所以被认ؓ是一个容器,是因为它能够像容器一样存攑֐U类型的对象Q简单地_vector是一个能够存放Q意类型的动态数l,能够增加和压~数据?/span>

Z可以使用vectorQ必d你的头文件中包含下面的代码:

#include <vector>

 

vector属于std命名域的Q因此需要通过命名限定Q如下完成你的代码:

using std::vector;

vector<int> vInts;

 

或者连在一P使用全名Q?/span>

std::vector<int> vInts;

 

使用全局的命名域方式Q?/span>

using namespace std;

 

在后面的操作中全局的命名域方式会造成一些问题?/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>vectorQ含?/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>Widgetcd的空?/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>Widgetcd数据?/span>vectorQ?/span>

vector<Widget> vWidgets(500);

 

创徏一个包?/span>500?/span>Widgetcd数据?/span>vectorQƈ且都初始化ؓ0Q?/span>

vector<Widget> vWidgets(500, Widget(0));

 

创徏一?/span>Widget的拷贝:

vector<Widget> vWidgetsFromAnother(vWidgets);

 

?/span>vectord一个数?/span>

vectord数据的缺省方法是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>-1Q你可以使用下面的代码实玎ͼ

int nSize = v.empty() ? -1 : static_cast<int>(v.size());

 

讉Kvector中的数据

使用两种Ҏ(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:

#include <algorithm>

 

         Remove_if()有三个参敎ͼ

1?span>   iterator _FirstQ指向第一个数据的q代指针?/span>

2?span>   iterator _LastQ指向最后一个数据的q代指针?/span>

3?span>   predicate _PredQ一个可以对q代操作的条件函数?/span>

 

条g函数

条g函数是一个按照用户定义的条gq回是或否的l果Q是最基本的函数指针,或者是一个函数对象。这个函数对象需要支持所有的函数调用操作Q重?/span>operator()()操作?/span>remove_if()是通过unary_functionl承下来的,允许传递数据作为条件?/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 vQ它的内存大ؓ1000Q当我们调用size()的时候,它的大小仅ؓ7。我们浪费了大量的内存。让我们在它的基上创Z?/span>vector?/span>

 

std::vector<CString> vNew(v);

cout << vNew.capacity();

 

vNew.capacity()q回的是7。这说明新创建的只是Ҏ(gu)实际大小来分配的I间。现在我们不想释?/span>vQ因为我们要在其它地方用到它Q我们可以?/span>swap()?/span>v?/span>vNew互相交换一下?

 

    vNew.swap(v);

    cout << vNew.capacity();

    cout << v.capacity();

 

有趣的是Q?/span>vNew.capacity()?/span>1000Q?/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.



q梦新媄 2010-06-23 13:56 发表评论
]]>
C++ STL~程L入门http://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116947.htmlq梦新媄q梦新媄Tue, 01 Jun 2010 16:17:00 GMThttp://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116947.htmlhttp://www.shnenglu.com/lovefeel2004/comments/116947.htmlhttp://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116947.html#Feedback0http://www.shnenglu.com/lovefeel2004/comments/commentRss/116947.htmlhttp://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>




q梦新媄 2010-06-02 00:17 发表评论
]]>
C++cdQOTL通用的数据库q接cdhttp://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116946.htmlq梦新媄q梦新媄Tue, 01 Jun 2010 16:05:00 GMThttp://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116946.htmlhttp://www.shnenglu.com/lovefeel2004/comments/116946.htmlhttp://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116946.html#Feedback0http://www.shnenglu.com/lovefeel2004/comments/commentRss/116946.htmlhttp://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;

}



q梦新媄 2010-06-02 00:05 发表评论
]]>
boost库linux~译安装http://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116943.htmlq梦新媄q梦新媄Tue, 01 Jun 2010 15:36:00 GMThttp://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116943.htmlhttp://www.shnenglu.com/lovefeel2004/comments/116943.htmlhttp://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116943.html#Feedback0http://www.shnenglu.com/lovefeel2004/comments/commentRss/116943.htmlhttp://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>


q梦新媄 2010-06-01 23:36 发表评论
]]>
在Linuxpȝ中安装和配置ACE(?http://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116942.htmlq梦新媄q梦新媄Tue, 01 Jun 2010 15:31:00 GMThttp://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116942.htmlhttp://www.shnenglu.com/lovefeel2004/comments/116942.htmlhttp://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116942.html#Feedback0http://www.shnenglu.com/lovefeel2004/comments/commentRss/116942.htmlhttp://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>


q梦新媄 2010-06-01 23:31 发表评论
]]>
þƵ| 99þ99ֻѵľƷ| þþƷһ| þþþ99ƷƬëƬ | ˾þ뾫ƷĻ| Ʒþþþþù| þó˾ƷƵ| ŷԴսþþþþ| ŷ츾XXXXԾþþ| þԭƷ| һһþaþþƷۺ | Ʒһþ㽶߿ۿ| ƷŮþþþavˬ | ޹Ʒþþ| þþƷ| ˾þô߽AVһ| 97þù޾Ʒ | Ʒһþ㽶߿| ޹Ʒþһ| ĻhdþþƷ | þ۲ӰԺѿҹɫ| ھƷþ޻ | ˾þþƷһ| þպƬ| þþƷ޾Ʒŷ| һþþƷ| 777ҹƷþav| һɫþۺϺݺƪ | ձ޷츾þþþþ| ޹Ʒþþž| ˺ݺۺϾþ88| ھƷþþþӰԺձ| ɫþþۺ| þݺҹҹ | ˾þˬ| ޳ɫWWWþվ| ٸþ| þþƷһ99| þþùƷһ| þþþƷһ | þ۲ӰԺѿҹɫ|