??xml version="1.0" encoding="utf-8" standalone="yes"?>色综合久久久久网,91精品婷婷国产综合久久 ,久久久久久久综合日本http://www.shnenglu.com/lovefeel2004/专注C/C++QLinuxzh-cnWed, 07 May 2025 23:34:57 GMTWed, 07 May 2025 23:34:57 GMT60一个非常有用的Linux命o(h)--cuthttp://www.shnenglu.com/lovefeel2004/archive/2010/08/15/123473.htmlq梦新媄(jing)q梦新媄(jing)Sat, 14 Aug 2010 17:11:00 GMThttp://www.shnenglu.com/lovefeel2004/archive/2010/08/15/123473.htmlhttp://www.shnenglu.com/lovefeel2004/comments/123473.htmlhttp://www.shnenglu.com/lovefeel2004/archive/2010/08/15/123473.html#Feedback1http://www.shnenglu.com/lovefeel2004/comments/commentRss/123473.htmlhttp://www.shnenglu.com/lovefeel2004/services/trackbacks/123473.html阅读全文

q梦新媄(jing) 2010-08-15 01:11 发表评论
]]>
CentOS常用命o(h)(收藏)http://www.shnenglu.com/lovefeel2004/archive/2010/08/15/123472.htmlq梦新媄(jing)q梦新媄(jing)Sat, 14 Aug 2010 17:03:00 GMThttp://www.shnenglu.com/lovefeel2004/archive/2010/08/15/123472.htmlhttp://www.shnenglu.com/lovefeel2004/comments/123472.htmlhttp://www.shnenglu.com/lovefeel2004/archive/2010/08/15/123472.html#Feedback0http://www.shnenglu.com/lovefeel2004/comments/commentRss/123472.htmlhttp://www.shnenglu.com/lovefeel2004/services/trackbacks/123472.html在电(sh)脑常用操作中Q我们经怼(x)用到CentOS常用命o(h)。所以,我们对一些经怋用又很重要的CentOS常用命o(h)q行?jin)全面的整理。下面,q大家介绍q些CentOS常用命o(h)?/p>

一Q用CentOS常用命o(h)查看cpu

more /proc/cpuinfo | grep "model name"  
grep "model name" /proc/cpuinfo  
[root@localhost /]# grep "CPU" /proc/cpuinfo  
model name      : Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz  
model name      : Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz  
如果觉得需要看的更加舒?br>grep "model name" /proc/cpuinfo | cut -f2 -d:

二:(x)使用CentOS常用命o(h)查看内存

grep MemTotal /proc/meminfo  grep MemTotal /proc/meminfo | cut -f2 -d:  free -m |grep "Mem" | awk '{print $2}'

三:(x)使用CentOS常用命o(h)查看cpu?2位还?4?/strong>

查看CPU位数(32 or 64)
getconf LONG_BIT

四:(x)使用CentOS常用命o(h)查看当前linux的版?/strong>

more /etc/redhat-release
cat /etc/redhat-release

五:(x)使用CentOS常用命o(h)查看内核版本

uname -r
uname -a

六:(x)使用CentOS常用命o(h)查看当前旉

date上面已经介绍如何同步旉?/p>

七:(x)使用CentOS常用命o(h)查看盘和分?/strong>

df -h
fdisk -l
也可以查看分?br>du -sh
可以看到全部占用的空?br>du /etc -sh
可以看到q个目录的大?/p>

八:(x)使用CentOS常用命o(h)查看安装的Y件包

查看pȝ安装的时候装的Y件包
cat -n /root/install.log
more /root/install.log | wc -l
查看现在已经安装?jin)那些Y件包
rpm -qa
rpm -qa | wc -l
yum list installed | wc -l
不过很奇怪,我通过rpmQ和yumq两U方式查询的安装软g包,数量q不一栗没有找到原因?/p>

?ji)?x)使用CentOS常用命o(h)查看键盘布局

cat /etc/sysconfig/keyboard
cat /etc/sysconfig/keyboard | grep KEYTABLE | cut -f2 -d=

十:(x)使用CentOS常用命o(h)查看selinux情况

sestatus
sestatus | cut -f2 -d:
cat /etc/sysconfig/selinux

十一Q用CentOS常用命o(h)查看ipQmac地址

在ifcfg-eth0 文g里你可以看到macQ网关等信息?nbsp; ifconfig  cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep IPADDR  cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep IPADDR | cut -f2 -d=  ifconfig eth0 |grep "inet addr:" |awk '{print $2}'|cut -c 6-  ifconfig   | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'  查看|关  cat /etc/sysconfig/network  查看dns  cat /etc/resolv.conf  十二Q用CentOS常用命o(h)查看默认语言
echo $LANG $LANGUAGE
cat /etc/sysconfig/i18n

十二Q用CentOS常用命o(h)查看所属时区和是否使用UTC旉

cat /etc/sysconfig/clock

十三Q用CentOS常用命o(h)查看L?/strong>

hostname
cat /etc/sysconfig/network
修改L名就是修改这个文Ӟ同时最好也把host文g也修攏V?/p>

十四Q用CentOS常用命o(h)查看开行时?/strong>

uptime
09:44:45 up 67 days, 23:32, ...
看来刚才实是网D늚问题Q我的机器还?7天前开机的?br>#pȝ资源使用情况

vmstat 1 -S m  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------  r b   swpd   free   buff cache   si   so    bi    bo   in   cs us sy id wa st  0 0      0    233    199    778    0    0     4    25    1    1 3 0 96 0 0  0 0      0    233    199    778    0    0     0     0 1029 856 13 1 86 0 0



]]>
Oracle 10G Linux 安装W记 http://www.shnenglu.com/lovefeel2004/archive/2010/07/03/119208.htmlq梦新媄(jing)q梦新媄(jing)Fri, 02 Jul 2010 16:40:00 GMThttp://www.shnenglu.com/lovefeel2004/archive/2010/07/03/119208.htmlhttp://www.shnenglu.com/lovefeel2004/comments/119208.htmlhttp://www.shnenglu.com/lovefeel2004/archive/2010/07/03/119208.html#Feedback0http://www.shnenglu.com/lovefeel2004/comments/commentRss/119208.htmlhttp://www.shnenglu.com/lovefeel2004/services/trackbacks/119208.htmlW一部分 安装linux

    1.  操作pȝ的安装省略,注意配置囑Ş界面

    2.  验证安装

    通过q行以下命o(h)(g)查内核版本:(x)

    uname –r

    其他所需E序包的版本Q或更高版本Q:(x)

    gcc-3.2.3-2

    make-3.79

    binutils-2.11

    openmotif-2.2.2-16

    setarch-1.3-1

    compat-db-4.0.14.5

    以上为必需的程序包

    compat-gcc-7.3-2.96.122

    compat-gcc-c++-7.3-2.96.122

    compat-libstdc++-7.3-2.96.122

    compat-libstdc++-devel-7.3-2.96.122

    以上为可选程序包Q最好安装上

    要查看系l上安装?jin)这些程序包的哪些版本,?root 用户w䆾q行以下命o(h)Q?/p>

    rpm -q gcc make binutils openmotif setarch compat-db compat-gcc compat-gcc-c++ compat-libstdc++ compat-libstdc++-devel

W二部分Q针?nbsp;Oracle 配置 Linux

    1.  验证pȝ要求

    要验证系l是否满?Oracle 10g 数据?/a>的最低要求,?root 用户w䆾dq运行以下命令?/p>

    要查看可?RAM 和交换空间大,q行以下命o(h)Q?/p>

    grep MemTotal /proc/meminfo

    grep SwapTotal /proc/meminfo

    所需最?RAM ?512MBQ而所需最交换空间ؓ(f) 1GB.对于 RAM 于或等?2GB 的系l,交换I间应ؓ(f) RAM 数量的两倍;对于 RAM 大于 2GB 的系l,交换I间应ؓ(f) RAM 数量的一C倍?/p>

    Oracle 10g 软gq需?2.5GB 的可用磁盘空_(d)而数据库则另需 1.2GB 的可用磁盘空间?tmp 目录臛_需?400MB 的可用空间。要(g)查系l上的可用磁盘空_(d)q行以下命o(h)Q?/p>

    df –h

    2.  创徏 Oracle l和用户帐户

    接下来,创徏用于安装和维?Oracle 10g 软g?Linux l和用户帐户。用户帐户将UCؓ(f) oracleQ而组称?oinstall ?dba.? root 用户w䆾执行以下命o(h)Q?/p>

    /usr/sbin/groupadd oinstall

    /usr/sbin/groupadd dba

    /usr/sbin/useradd -m -g oinstall -G dba oracle

    讄 oracle 帐户的口令:(x)

    passwd oracle

    3.  创徏目录

    现在Q创建存?Oracle 10g 软g和数据库文g的目录。本指南在创建目录结构时所用的命名惯例W合最佳灵zȝ?QOFAQ?规范。有?OFA 标准的更多信息,请参阅针?UNIX pȝ?Oracle 数据?10g 安装指南 的附?D.

    以下假设在根文gpȝ中创建目录。这样做是ؓ(f)?jin)简便v见,不徏议将其作为通用做法。这些目录通常被创Zؓ(f)单独的文件系l?/p>

    ?root 用户w䆾执行以下命o(h)Q?/p>

    mkdir -p /u01/app/oracle

    mkdir -p /u02/oradata

    chown -R oracleQoinstall /u01/app/oracle /u02/oradata

    chmod -R 775 /u01/app/oracle /u02/oradata

    4.  配置 Linux 内核参数

    Linux 内核非常?gu)。与大多数其?*NIX pȝ不同QLinux 允许在系l启动和q行时修改大多数内核参数。完成内核参数更改后不必重新启动pȝ。Oracle 数据?10g 需要以下所C的内核参数讄。其中给出的是最|因此如果(zhn)的pȝ使用的D大,则不要更改它?/p>

    kernel.shmall = 2097152

    kernel.shmmax = 2147483648

    kernel.shmmni = 4096

    kernel.sem = 250 32000 100 128

    fs.file-max = 65536

    net.ipv4.ip_local_port_range = 1024 65000

    如果(zhn)正的安装?jin)linuxQ且内核参数全部采用默认|则只需在以 root 用户w䆾d后执行下命o(h)?/p>

    cat >> /etc/sysctl.conf <<EOF

    kernel.shmall = 2097152

    kernel.shmmax = 2147483648

    kernel.shmmni = 4096

    kernel.sem = 250 32000 100 128

    fs.file-max = 65536

    net.ipv4.ip_local_port_range = 1024 65000

    EOF

    /sbin/sysctl –p

    ?root 用户w䆾q行以下命o(h)来验证?zhn)的设|:(x)

    /sbin/sysctl -a | grep shm

    /sbin/sysctl -a | grep sem

    /sbin/sysctl -a | grep file-max

    /sbin/sysctl -a | grep ip_local_port_range

    如果pȝ的参数设|的比上q参数值小Q则~辑 /etc/sysctl.conf 文gQ添加或更改q些参数。完成后Q运行以下命令激zL改:(x)

    /sbin/sysctl –p

    5.  ?oracle 用户讄 Shell 限制

    Oracle Ҏ(gu)?Linux 帐户可以使用的进E数和打开的文件数讄限制。要q行q些更改Q以 root 用户的n份执行下列命令:(x)

    cat >> /etc/security/limits.conf <<EOF

    oracle               soft    nproc   2047

    oracle               hard    nproc   16384

    oracle               soft    nofile  1024

    oracle               hard    nofile  65536

    EOF

    cat >> /etc/pam.d/login <<EOF

    session    required     /lib/security/pam_limits.so

    EOF

    cat >> /etc/profile <<EOF

    if [ \$USER = "oracle" ]Q?then

    if [ \$SHELL = "/bin/ksh" ]Q?then

    ulimit -p 16384

    ulimit -n 65536

    else

    ulimit -u 16384 -n 65536

    fi

    umask 022

    fi

    EOF

    cat >> /etc/csh.login <<EOF

    if Q?\$USER == "oracle" Q?then

    limit maxproc 16384

    limit descriptors 65536

    umask 022

    endif

    EOF

    6.  oracle 用户的环境变?/p>

    要?Oracle 产品Q应该或必须讄几个环境变量。对于数据库服务?/a>Q徏议设|以下环境变量:(x)

    ORACLE_BASE

    ORACLE_HOME

    ORACLE_SID

    PATH

    如果(zhn)在同一服务器上安装?jin)多?Oracle 产品或数据库Q则 ORACLE_HOME、ORACLE_SID ?PATH 变量可能?x)更攏VORACLE_BASE 变量不应更改Qƈ可以在需要时在?zhn)的登录配|文件中讄它。Oracle 提供?jin)一个称?oraenv 的实用程序来讄其他变量?/p>

    ?oracle w䆾dQƈ通过?.bash_profile中添加以下行Q?/p>

    TMP=/tmpQ?/p>

    export TMP

    TMPDIR=$TMPQ?/p>

    export TMPDIR

    ORACLE_BASE=/u01/app/oracleQ?/p>

    export ORACLE_BASE

    ORACLE_HOME=$ORACLE_BASE/oracle/product/10.2.0/db_1Q?/p>

    export ORACLE_HOME

    ORACLE_SID=mydbQ?/p>

    export ORACLE_SID

    ORACLE_TERM=xtermQ?/p>

    export ORACLE_TERM

    PATH=/usr/sbinQ?PATHQ?/p>

    export PATH

    PATH=$ORACLE_HOME/binQ?PATHQ?/p>

    export PATH

    LD_LIBRARY_PATH=$ORACLE_HOME/libQ?libQ?usr/libQ?/p>

    export LD_LIBRARY_PATH

    CLASSPATH=$ORACLE_HOME/JREQ?ORACLE_HOME/jlibQ?ORACLE_HOME/rdbms/jlibQ?/p>

    export CLASSPATH

    NLS_LANG="Simplified Chinese_china".ZHS16GBKQ?/p>

    export NLS_LANG

    此更改将在?zhn)下次d?oracle 帐户时生效?/p>

  W三部分Q安?nbsp;Oracle

    1.安装软g

    使用 oracle 帐户d?/p>

    目录更改ؓ(f) Oracle 10g 软g解压~到的位|?/p>

    启动 Oracle 通用安装E序?/p>

    $ ./runInstaller

    1Q欢q?/p>

    Ø         单击 Next.

    2Q指定清单目录和证书

    Ø         如果(zhn)一直在依@本指南中的步骤,则用默认值即可。否则,~辑清单目录的\径,以指向正目录?/p>

    Ø         操作pȝl名U应?oinstall.

    3Q如果这是首ơ在此机器上安装 OracleQ则(zhn)将收到一个弹出窗口,提示需要以 root 用户w䆾q行 orainstRoot.sh 脚本。以 root 用户w䆾dQ更改到H口中指定的目录Q执行该脚本Q然后(h)l操作?/p>

    4Q指定文件位|?/p>

    Ø         如果(zhn)一直在依@本指南中的步骤,则用默认值即可。否则,在(h)l操作前保源\径和目标路径正确?/p>

    5Q选择安装cd

    Ø         接受默认?Enterprise Edition.

    6Q与特定产品相关的先x(chng)件的(g)?/p>

    Ø         如果(zhn)一直在依@本指南中的步骤,则所有检查都应顺利通过。如果一个或多个(g)查失败,则在l箋(hu)操作前纠正该问题?/p>

    7Q选择数据?/a>配置

    Ø         接受默认?Create a starter database ?General Purpose.

    8Q指定数据库配置选项

    Ø         输入数据库的全局数据库名U。该名称应包?ORACLE_SID ?a style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; COLOR: rgb(48,128,203); PADDING-TOP: 0px; BORDER-BOTTOM: rgb(104,195,238) 1px dotted; TEXT-DECORATION: none" target="_blank">服务?/a>域名Q例如,demo1.orademo.orgQ其?demo1 ?ORACLE_SIDQorademo.org 是域名)(j)?/p>

    Ø         输入全局数据库名U时QSID 框将自动填充?/p>

    Ø         接受默认的数据库字符集?/p>

    Ø         选择 Create database with sample schemas.

    9Q选择数据库管理选项

    Ø         选择 Use Database Control for Database Management.

    10Q指定数据库文g存储选项

    Ø         选择 File SystemQ然后输入数据库文g要用的路径名(在本例中?/u02/oradataQ?/p>

    11Q指定备份和恢复选项

    Ø          选择 Do not enable Automated backups.

    12Q指定数据库模式口o(h)

    Ø         选择 Use the same password for all the accounts.

    Ø         选择一个口令,然后输入两次q行认?/p>

    13Q摘?/p>

    Ø         昄已安装品的摘要?/p>

    单击 Install.



]]>
Oracle 语句大全http://www.shnenglu.com/lovefeel2004/archive/2010/07/03/119207.htmlq梦新媄(jing)q梦新媄(jing)Fri, 02 Jul 2010 16:38:00 GMThttp://www.shnenglu.com/lovefeel2004/archive/2010/07/03/119207.htmlhttp://www.shnenglu.com/lovefeel2004/comments/119207.htmlhttp://www.shnenglu.com/lovefeel2004/archive/2010/07/03/119207.html#Feedback0http://www.shnenglu.com/lovefeel2004/comments/commentRss/119207.htmlhttp://www.shnenglu.com/lovefeel2004/services/trackbacks/119207.html阅读全文

]]>
中国?jng)?6句震g界的语 http://www.shnenglu.com/lovefeel2004/archive/2010/06/24/118666.htmlq梦新媄(jing)q梦新媄(jing)Thu, 24 Jun 2010 13:18:00 GMThttp://www.shnenglu.com/lovefeel2004/archive/2010/06/24/118666.htmlhttp://www.shnenglu.com/lovefeel2004/comments/118666.htmlhttp://www.shnenglu.com/lovefeel2004/archive/2010/06/24/118666.html#Feedback0http://www.shnenglu.com/lovefeel2004/comments/commentRss/118666.htmlhttp://www.shnenglu.com/lovefeel2004/services/trackbacks/118666.html2.如果你不l自q(ch)|别h也永q不可能l你?ch)恼。因Z自己的内?j),你放不下?
3.你永q要感谢l你逆境的众生?
4.你永q要宽恕众生Q不Z有多坏,甚至他伤完你,你一定要放下Q才能得到真正的快乐?
5.当你快乐Ӟ你要惌快乐不是永恒的。当你痛苦时Q你要想q痛苦也不是永恒的?
6.今日的执著,?x)造成明日的后(zhn)?
7.你可以拥有爱Q但不要执著Q因为分L必然的?
8.不要费你的生命在你一定会(x)后?zhn)的地方上?
9.你什么时候放下,什么时候就没有?ch)恼?
10.每一U创伤,都是一U成熟?
11.狂妄的h有救Q自卑的人没有救Q认识自己,降伏自己Q改变自己,才能改变别h?
12.你不要一直不满hӞ你应该一直检讨自己才寏V不满hӞ是苦?jin)你自己?
13.一个h如果不能从内?j)去原谅别hQ那他就永远不会(x)?j)安理得?
14.?j)中装满着自己的看法与x(chng)的hQ永q听不见别h的心(j)声?
15.毁灭人只要一句话Q培植一个h却要千句话,请你多口下留情?
16.Ҏ(gu)不必回头ȝ咒骂你的人是谁?如果有一条疯狗咬你一口,N你也要趴下去反咬他一口吗Q?
17.永远不要费你的一分一U,LM不喜Ƣ你的h?
18.请你用慈(zhn)心(j)和温和的态度Q把你的不满与委屈说出来Q别人就Ҏ(gu)接受?
19.同样的瓶子,你ؓ(f)什么要装毒药呢Q同L(fng)?j)里Q你Z么要充满着?ch)恼呢?
20.得不到的东西Q我们会(x)一直以Z是美好的Q那是因Z对他?jin)解太少Q没有时间与他相处在一赗当有一天,你深入了(jin)解后Q你?x)发现原不是你想像中的那么美好?
21.zȝ一天,是有福气,p珍惜。当我哭泣我没有鞋子I的时候,我发现有人却没有脚?
22.多一分心(j)力去注意别hQ就一分心(j)力反省自己,你懂吗?
23.憎恨别h对自己是一U很大的损失?
24.每一个h都拥有生命,但ƈ非每个h都懂得生命,乃至于珍惜生命。不?jin)解生命的hQ生命对他来_(d)是一U惩|?
25.情执是苦恼的原因Q放下情执,你才能得到自?
26.不要太肯定自q看法Q这样子比较?yu)后?zhn)?
27.当你对自p实的时候,世界上没有h能够ƺ骗得了(jin)你?
28.用伤宛_人的手段来掩饰自q点的人,是可ȝ?
29.默默的关怀与祝别人,那是一U无形的布施?
30.不要Lȝ他人的x(chng)Q如果你没有智慧与经验的正确判断Q通常都会(x)有错误的?
31.要了(jin)解一个hQ只需要看他的出发点与目的地是否相同,可以知道他是否真心(j)的?
32.人生的真理,只是藏在qx(chng)E无味之中?
33.不洗澡的人,擦香水是不?x)香的。名C贵Q是来自于真才实学的。有徯焉?
34.旉M(x)q去的,让时间流C的烦(ch)恼吧Q?
35.你硬要把单纯的事情看得很严重Q那样子你会(x)很痛苦?
36.永远扭曲别h善意的hQ无药可救?
37.说一句谎话,要编造十句谎话来弥补Q何苦呢Q?
38.白白的过一天,无所事事Q就像犯?jin)窃盗罪一?
39.q结众缘Q就是不要去伤害M一个h?
40.沉默是毁谤最好的{覆?
41.对h恭敬Q就是在庄严你自己?
42.拥有一颗无U的爱心(j)Q便拥有?jin)一切?
43.来是偶然的,走是必然的。所以你必须Q随~(sh)变,不变随缘?
44.慈?zhn)是你最好的武器?
45.只要面对现实Q你才能越现实?
46.良心(j)是每一个h最公正的审判官Q你骗得?jin)别人,却永q骗不了(jin)你自q良心(j)?
47.不懂得自q人,是没有能力去爱别人的?
48.有时候我们要冷静(rn)问问自已Q我们在q求什么?我们zȝZ(jin)什么?
49.不要因ؓ(f)小的争执,q离?jin)你至亲的好友,也不要因为小的怨恨Q忘C(jin)别h的大恩?
50.感谢上苍我所拥有的,感谢上苍我所没有的?
51.凡是能站在别人的角度Z人着惻Iq个是慈?zhn)?
52.说话不要有攻?yn)L,不要有杀伤力Q不夸已能,不扬人恶Q自然能化敌为友?
53.诚实的面对你内心(j)的矛监֒污点Q不要欺骗你自己?
54.因果不曾亏欠q我们什么,所以请不要抱怨?
55.大多数的Z辈子只做?jin)三件事Q自ƺ、欺人、被人欺?
56.?j)是最大的骗子Q别骗你一Ӟ而它却会(x)骗你一辈子
57.只要自觉?j)安Q东西南北都好。如有一人未度,切莫自己逃了(jin)?
58.当你手中抓住一件东西不放时Q你只能拥有qg东西Q如果你肯放手,你就有机?x)选择别的。h的心(j)若死执自q观念Q不肯放下,那么他的智慧也只能达到某U程度而已
59.如果你能够^q_安的渡过一天,那就是一U福气了(jin)。多h在今天已l见不到明天的太阻I多少人在今天已经成了(jin)D废Q多h在今天已l失M(jin)自由Q多h在今天已l家破h亡?
60.你有你的生命观,我有我的生命观,我不q涉你。只要我能,我就感化你。如果不能,那我p命?
61.你希望掌握永恒,那你必须控制现在?
62.恶口永远不要?gu)于我们的口中Q不他有多坏,有多恶。你愈骂他,你的?j)就被污染?jin)Q你要想Q他是你的善知识?
63.别h可以q背因果Q别人可以害我们Q打我们Q毁谤我们。可是我们不能因此而憎恨别人,Z么?我们一定要保有一颗完整的本性和一颗清净的心(j)?
64.如果一个h没有苦难的感受,׃Ҏ(gu)对他人给予同情。你要学救苦救难的精,得先受苦受难?
65.世界原本׃是属于你Q因此你用不着抛弃Q要抛弃的是一切的执著。万物皆为我所用,但非我所属?
66.虽然我们不能改变周遭的世界,我们只好改变自己,用慈(zhn)心(j)和智慧心(j)来面对这一切?br>

]]>
STL vector 容器介绍http://www.shnenglu.com/lovefeel2004/archive/2010/06/23/118556.htmlq梦新媄(jing)q梦新媄(jing)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(jin)介绍std::vectorQ如何恰当地使用它们的成员函数等操作。本文中q讨Z(jin)条g函数和函数指针在q代法中用,如在remove_if()?/span>for_each()中的使用。通过阅读q篇文章读者应该能够有效地使用vector容器Q而且应该不会(x)再去使用Ccd的动态数l了(jin)?/span>

 

Vector总览

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

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

#include <vector>

 

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

using std::vector;

vector<int> vInts;

 

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

std::vector<int> vInts;

 

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

using namespace std;

 

在后面的操作中全局的命名域方式?x)造成一些问题?/span>vector容器提供?jin)很多接口,在下面的表中列?/span>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容器提供?jin)多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ƈ且都初始化ؓ(f)0Q?/span>

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

 

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

vector<Widget> vWidgetsFromAnother(vWidgets);

 

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

vectord数据的缺省方法是push_back()?/span>push_back()函数表示数据添加到vector的尾部,q按需要来分配内存。例如:(x)?/span>vector<Widget>中添?/span>10个数据,需要如下编写代码:(x)

for(int i= 0;i<10; i++)

    vWidgets.push_back(Widget(i));

 

获取vector中制定位|的数据

很多时候我们不必要知道vector里面有多数据,vector里面的数据是动态分配的Q?/span>push_back()的一pd分配I间常常军_于文件或一些数据源。如果你想知?/span>vector存放?jin)多数据,你可以?/span>empty()。获?/span>vector的大,可以使用size()。例如,如果你想获取一?/span>vector v的大,但不知道它是否ؓ(f)I,或者已l包含了(jin)数据Q如果ؓ(f)I想讄?/span>-1Q你可以使用下面的代码实玎ͼ(x)

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

 

讉Kvector中的数据

使用两种Ҏ(gu)来访?/span>vector?/span>

1?span>   vector::at()

2?span>   vector::operator[]

operator[]主要是ؓ(f)?jin)?/span>C语言q行兼容。它可以?/span>C语言数组一h作。但at()是我们的首选,因ؓ(f)at()q行?jin)边界检查,如果讉K过?/span>vector的范_(d)抛Z个例外。由?/span>operator[]Ҏ(gu)造成一些错误,所有我们很用它,下面q行验证一下:(x)

分析下面的代码:(x)

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:(x)


你可以在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是个别的数据。在考虑删除{操作之前让我们?rn)下来考虑一下在STL中的一些应用?/span>

 

Remove_if()

现在我们考虑操作里面的数据。如果要使用remove_if()Q我们需要在头文件中包含如下代码Q:(x)

#include <algorithm>

 

         Remove_if()有三个参敎ͼ(x)

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如果字串中包含?jin)一个|从这个值开始,从这个值结束。首先你应该建立一个数据结构来包含q些数据Q类g码如下:(x)

#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()能做什么?

你可能会(x)疑惑Q对于上面那个例子在调用remove_if()的时候还要?/span>erase()呢?q是因ؓ(f)大家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行?jin)修改,在数据的后面存在一些残(hu)余的数据Q那些需要删除的数据。剩下的数据的位|可能不是原来的数据Q但他们是不知道的?/span>

调用erase()来删除那些残(hu)余的数据。注意上面例子中通过erase()删除remove_if()的结果和vs.enc()范围的数据?/span>

 

压羃一个臃肿的vector

很多时候大量的删除数据Q或者通过使用reserve()Q结?/span>vector的空间远q大于实际需要的。所有需要压~?/span>vector到它实际的大?/span>resize()能够增加vector的大?/span>Clear()仅仅能够改变~存的大,所有的q些对于vector释放内存{九(ji)非常重要?jin)。如何来解决q些问题呢,让我们来操作一下?/span>

我们可以通过一?/span>vector创徏另一?/span>vector。让我们看看q将发生什么。假定我们已l有一?/span>vector vQ它的内存大ؓ(f)1000Q当我们调用size()的时候,它的大小仅ؓ(f)7。我们浪费了(jin)大量的内存。让我们在它的基上创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>

现在是达到我的目的了(jin)Q但是ƈ不是很好的解x(chng)法,我们可以像下面这么写Q?/span>

 

    std::vector<CString>(v).swap(v);

     

你可以看到我们做?jin)什么?我们创徏?jin)一个(f)时变量代曉K个命名的Q然后?/span>swap(),q样我们去掉了(jin)不必要的I间Q得到实际大的v?/span>

 

l论

我希望这个文档可以给那些使用STL vector容器的开发者很有h(hun)值的参考。我也希望通过阅读q篇文章你可以放?j)地使?/span>vector来代?/span>C语言中的数据?jin)?/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梦新媄(jing)q梦新媄(jing)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
  1 初识STLQ解{一些疑问  1.1 一个最兛_(j)的问题:(x)什么是STLU学领域里所常用的基本数据结构和基本法。ؓ(f)q大C++E序员(sh)提供?jin)一个可扩展的应用框Ӟ高度体现?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对于此二者,大家一定不?x)陌生吧?br style="WORD-BREAK: break-all">
  "什么是STLQ?Q假如你对STLq知之甚,那么我想Q你一定很想知道这个问题的{案Q坦率地Ԍ要指望用短短数言这个问题阐q清楚,也决非易事。因此,如果你在看完本节之后q是觉得似懂非懂Q大可不必着急,在阅M(jin)后箋(hu)内容之后Q相信你对STL的认识,会(x)愈加清晰、准和完整。不q,上述q番话听h是否有点像是在ؓ(f)自己p糕的表达能力开q责呢Q?Q?span class=Apple-converted-space> 


  不知道你是否有过q样的经历。在你准备着手完成数据结构老师所布置的家庭作业时Q或者在你ؓ(f)你所负责的某个Y仉目中d一Ҏ(gu)功能Ӟ你发现需要用C个链?List)或者是映射表(MapQ之cȝ东西Q但是手头ƈ没有现成的代码。于是在你开始正式考虑E序功能之前Q手工实现List或者Map是不可避免的。于?#8230;…Q最l你利完成?jin)Q务。或许此Ӟ作ؓ(f)一个具有较高素ȝE序员的你还?sh)肯|休Q或者是一个喜Ƣ偷懒的优等?Q,因ؓ(f)你会(x)惛_Q如果以后还遇到q样的情冉|么办?没有必要再做一遍同L(fng)事情吧! 

  如果说上q这U情形每天都在发生,或许有点夸张。但是,如果说整个Y仉域里Q数十年来确实都在ؓ(f)?jin)一个目标而奋?-可复用性(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技术(如:(x)COM、EJBQ,到设计模式(design patternQ等{。而STL也在做着cM的事情,同时在它背后蕴涵着一U新的程序设计思想--泛型化设计(generic programmingQ?span class=Apple-converted-space> 

  l箋(hu)上面提到的那个例子,假如你把List或者map完好的保留了(jin)下来Q正在暗自得意。且慢,如果下一回的List里放的不是QҎ(gu)而是整数呢?如果你所实现的Map在效率上L令你不太满意q且有时q(sh)(x)Zbug呢?你该如何面对q些问题Q用STL是一个不错的选择Q确实如此,STL可以漂亮地解决上面提到的q些问题Q尽你q可以寻求其他方法?br>

  STLQStandard Template LibraryQ,x(chng)准模板库Q是一个具有工业强度的Q高效的C++E序库。它被容U于C++标准E序库(C++ Standard LibraryQ中Q是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了(jin)诸多?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(jin)泛型化程序设计的思想Qgeneric programmingQ,引入?jin)诸多新的名词,比如像需求(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源代码,你就?x)发玎ͼ模板作?f)构成整个STL的基x(chng)一件千真万的事情。除此之外,q有许多C++的新Ҏ(gu)ؓ(f)STL的实现提供了(jin)方便?span class=Apple-converted-space> 


  不知你对q里一下子冒出q么多术语做何感惻I希望不会(x)另你不愉快。假如你对它们之中的大多C甚了(jin)解,敬请攑ֿ(j)Q在后箋(hu)内容中将?x)对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共同开发了(jin)一U叫做Tecton的语a。尽这ơ尝试最l没有取得实用性的成果Q但却给?jin)Stepanov很大的启C?span class=Apple-converted-space> 

  在结识新朋友的时候,大多ChL忍不住想?jin)解?gu)的过厅R本节将带?zhn)单回一下STL的过厅R?span class=Apple-converted-space> 

  被誉为STL之父的Alexander StepanovQ出生于苏联莫斯U,早在20世纪70q代后半期,他便已经开始考虑Q在保证效率的前提下Q将法从诸多具体应用之中抽象出来的可能性,q便是后来泛型化思想的雏形。ؓ(f)?jin)验证自q思想Q他和纽U州立大学教授Deepak KapurQu塞里?dng)技?span class=Apple-converted-space> 

  在随后的几年中,他又和David Musser{h先后用Schema语言Q一ULisp语言的变U)(j)和Ada语言建立?jin)一些大型程序库。这光QAlexander Stepanov开始意识到Q在当时的面向对象程序设计思想中所存在的一些问题,比如抽象数据cd概念所存在的缺陗Stepanov希望通过对Y仉域中各组成部分的分类Q逐渐形成一UY件设计的概念性框架?span class=Apple-converted-space> 

  1987q左叻I在贝?dng)实验室工作的Alexander Stepanov开始首ơ采用C++语言q行泛型软g库的研究。但遗憾的是Q当时的C++语言q没有引入模板(templateQ的语法Q现在我们可以清楚的看到Q模板概念之于STL实现Q是何等重要。是时?dng)采用l承机制是别无选择的。尽如此,Stepanovq是开发出?jin)一个庞大的法库。与此同Ӟ在与Andrew KoenigQ前ISO C++标准化委员(sh)(x)dQ和Bjarne StroustrupQC++语言的创始hQ等大师们的׃q程中,Stepanov开始注意到C/C++语言在实现其泛型思想斚w所h的潜在优ѝ就拿C/C++中的指针而言Q它的灵zM高效q用Q后来的STL在实现泛型化的同时更是保持了(jin)高效率。另外,在STL中占据极光要地位的q代子概念便是源自于C/C++中原生指针( native pointerQ的抽象?br>
惠普的Palo Alto实验室工作,在随后的4q中Q他从事的是有关驱动器方面的工作。直?992q_(d)׃参加q主持了(jin)实验室主任Bill Worley所建立的一个有关算法的研究目Q才使他重新回到?jin)泛型化法的研I工作上来。项目自建立之后Q参与者从最初的8人逐渐减少Q最后只剩下两个?-Stepanove本h和Meng Lee。经q长旉的努力,最l,信念与汗水所换来的是一个包含有大量数据l构和算法部件的庞大q行库。这便是现在的STL的雏形(同时也是STL的一个实现版?-HP STLQ?span class=Apple-converted-space> 

  1993q_(d)当时在贝?dng)实验室的Andrew Koenig看到?jin)Stepanove的研I成果,很是兴奋。在他的鼓励与帮助下QStepanove于是q?月的圣何塞ؓ(f)ANSI/ISO C++标准委员?sh)(x)做了(jin)一个相x(chng)Ԍ题(sh)ؓ(f)"The Science of C++ Programming"Q,向委员(sh)讲述?jin)其观念。然后又于次q?月,在圣q戈?x)议上,向委员?sh)(x)提交?jin)一份徏议书Q以期STL成ؓ(f)C++标准库的一部分。尽这一十分庞大Q以至于降低?jin)被通过的可能性,但由于其所包含的新思想Q投结果以压倒多数的意见认ؓ(f)推迟对该的决定?span class=Apple-converted-space> 


  随后Q在众h的帮助之下,包括Bjarne Stroustrup在内QStepanove又对STLq行?jin)改q。同时加入了(jin)一个封装内存模式信息的抽象模块Q也是现在STL中的allocatorQ它使STL的大部分实现都可以独立于具体的内存模式,从而独立于具体q_。在同年夏季的滑铁卢?x)议上,委员(sh)?0%赞成Q?0%反对Q最l通过?jin)提案,军_STL正式U_C++标准化进E之中,随后STL便被放进?jin)?x)议的工作文g中。自此,STLl于成ؓ(f)?jin)C++家族中的重要一员?span class=Apple-converted-space> 

  此后Q随着C++标准的不断改q,STL也在不断C着相应的演化。直?998q_(d)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版中加入?jin)对STLport的支持,它用的STLport是4.5版的QC++ Builder 6.0同时q提供了(jin)STLport的用说明。你可以在C++ Builder的Include\Stlport子目录下扑ֈ所有头文gQ比如:(x)C:\Program Files\Borland\Cbuilder6\Include\StlportQ?.4.5 SGI STLhttp://www.sgi.com新版本是3.3?span class=Apple-converted-space> 


  在你?jin)解了(jin)STL的过M后,一些名词开始不断在你的大脑中Q玎ͼSTL、C++、C++标准函数库、泛型程序设计、面向对象程序设?#8230;…Q这些概忉|味着什么?他们之间的关pd是什么?如果你想?jin)解某些l节Q这里也许有你希望得到的{案?span class=Apple-converted-space> 


  没有C++语言没有STLQ这么说毫不。一般而言QSTL作ؓ(f)一个泛型化的数据结构和


  STL是最新的C++标准函数库中的一个子集,q个庞大的子集占据了(jin)整个库的大约80%的分量。而作为在实现STLq程中扮演关键角色的模板则充斥了(jin)几乎整个C++标准函数库。在q里Q我们有必要看一看C++标准函数库里包含?jin)哪些内容,其中又有哪些是属于标准模板库Q即STLQ的?span class=Apple-converted-space> 


  C++标准函数库ؓ(f)C++E序员(sh)提供?jin)一个可扩展的基性框架。我们从中可以获得极大的便利Q同时也可以通过l承现有c,自己~制W合接口规范的容器、算法、P代子{方式对之进行扩展。它大致包含?jin)如下几个组Ӟ?x) 

  C标准函数库,基本保持?jin)与原有C语言E序库的良好兼容Q尽有些微变化。h们M(x)忍不住留恋过ȝ好岁月Q如果你曄是一个CE序员,对这一点一定体?x)颇深。或许有一点会(x)让你觉得奇怪,那就是在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部分,包含?jin)一些标准类型的定义以及(qing)其他Ҏ(gu)的定义Q这些内容,被用于标准库的其他地Ҏ(gu)是具体的应用E序中?span class=Apple-converted-space> 

  诊断QdiagnosticsQ部分,提供?jin)用于程序诊断和报错的功能,包含了(jin)异常处理(exception handlingQ,断言QassertionsQ,错误代码Qerror number codesQ三U方式?span class=Apple-converted-space> 

  通用工具Qgeneral utilitiesQ部分,q部分内容ؓ(f)C++标准库的其他部分提供支持Q当然你也可以在自己的程序中调用相应功能。比如:(x)动态内存管理工P日期/旉处理工具。记住,q里的内容也已经被泛化了(jin)Q即采用?jin)模板机Ӟ?j)?span class=Apple-converted-space> 

  字符ԌstringQ部分,用来代表和处理文本。它提供?jin)够丰富的功能。事实上Q文本是一个string对象Q它可以被看作是一个字W序列,字符cd可能是charQ或者wchar_t{等。string可以被{换成char*cdQ这样便可以和以前所写的C/C++
代码和^共处?jin)。因为那时侯除了(jin)char*Q没有别的?span class=Apple-converted-space> 

  国际化(internationalizationQ部分,作ؓ(f)OOPҎ(gu)之一的封装机制在q里扮演着消除文化和地域差异的角色Q采用locale和facet可以为程序提供众多国际化支持Q包括对各种字符集的支持Q日期和旉的表C,数值和货币的处理等{。毕竟,在中国和在美国,Z表示日期的习(fn)惯是不同的?span class=Apple-converted-space> 

  容器QcontainersQ部分,STL的一个重要组成部分,늛?jin)许多数据结构,比如前面曄提到的链表,q有QvectorQ类g大小可动态增加的数组Q、queueQ队列)(j)、stackQ堆栈)(j)……。string也可以看作是一个容器,适用于容器的Ҏ(gu)同样也适用于string。现在你可以L的完成数据结构课E的家庭作业?jin)?br>

  q代器(iteratorsQ部分,STL的一个重要组成部分,如果没有q代器的撮合Q容器和法便无法结合的如此完美。事实上Q每个容器都有自qq代器,只有容器自己才知道如何访问自q元素。它有点像指针,法通过q代器来定位和操控容器中的元素?span class=Apple-converted-space> 


  数|numericsQ部分,包含?jin)一些数学运功能,提供?jin)复数运的支持?span class=Apple-converted-space> 


  输入/输出Qinput/outputQ部分,是l过模板化了(jin)的原有标准库中的iostream部分Q它提供?jin)对C++E序输入输出的基本支持。在功能上保持了(jin)与原有iostream的兼容,q且增加?jin)异常处理的机制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主要包含?jin)容器、算法、P代器。string也可以算做是STL的一部分?span class=Apple-converted-space> 

  正如前面所提到的,在STL的背后蕴含着泛型化程序设计(GPQ的思想Q在q种思想里,大部分基本算法被抽象Q被泛化Q独立于与之对应的数据结构,用于以相同或相近的方式处理各U不同情形。这一思想和面向对象的E序设计思想QOOPQ不相同,因ؓ(f)Q在OOP中更注重的是Ҏ(gu)据的抽象Q即所谓抽象数据类型(Abstract Data TypeQ,而算法则通常被附属于数据cd之中。几乎所有的事情都可以被看作cL者对象(即类的实例)(j)Q通常Q我们所看到的算法被作ؓ(f)成员函数Qmember functionQ包含在c(classQ中Q类和类则构成了(jin)错综复杂的(h)承体pR?span class=Apple-converted-space> 

  管在象C++q样的程序设计语a中,你还可以用全局函数来表C算法,但是在类gJavaq样的纯面向对象的语a中,全局函数已经?勒o(h)止"?jin)。因此,用Java来模拟GP思想是颇为困隄。如果你对前q的STL历史q有印象的话Q应该记得Alexander Stepanove也曾用基于OOP的语a试q实现GP思想Q但是效果ƈ不好Q包括没有引入模板之前的C++语言。站在巨人的肩膀上,我们可以得出q样的结论,在OOP中所体现的思想与GP的思想实是相异的。C++q不是一U纯面向对象的程序设计语aQ它的绝妙之处,在于既满?jin)OOPQ又成全?jin)GP。对于后者,模板立下?jin)汗马功功뀂另外,需要指出的是,管GP和OOP有诸多不同,但这U不同还?sh)至于?水火不容"的地步。ƈ且,在实际运用的时候,两者的l合使用往(xin)往(xin)可以佉K题的解决更ؓ(f)有效。作为GP思想实例的STL本n便是一个很好的范例Q如果没有(h)承,不知道STL?x)是什么样子,g没有人做q这L(fng)试验?br>
  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节)(j)。这个STL是开放源码的Q所以它允许M人免费用、复制、修攏V发布和销售该软g和相x(chng),前提是必d所有相x(chng)件中加入HP STL的版本信息和授权信息。现在已l很直接用这个版本的STL?jin)?span class=Apple-converted-space> 


  P. J. Plauger STL属于个h作品Q由P(pn). J. Plauger本h实现Q是HP STL的一个(h)承版本,因此在其所有头文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容器)(j)的效率不理想Q同时由于Visual C++对C++语言标准的支持不是很好(臛_直到VC6.0为止Q还是如此)(j)Q因此一定程度上影响?jin)P. J. Plauger STL的性能。此外,该版本的源代码可L较差,你可以在VC的Include子目录下扑ֈ所有源文gQ比如:(x)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的一个(h)承版本,除了(jin)HP STL的相兛_明之外,q有Rouge Wave公司的版权声明。同Ӟ它也不是开放源码的Q因此无法修改和销售。该版本被Borland C++ Builder所采用Q你可以在C++ Builder的Include子目录下扑ֈ所有头文gQ比如:(x)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的一个(h)承版本。它属于开放源码,因此你可以修改和销售它。SGI STL被GCCQlinux下的C++~译器)(j)所采用Q你可以在GCC的Include子目录下扑ֈ所有头文gQ比如:(x)C:\cygnus\cygwin-b20\include\g++\includeQ。由于GCC对C++语言标准的支持很好,SGI STL在linuxq_上的性能相当?gu)。此外,其源代码的可L也很好?/span>




]]>
C++cdQOTL通用的数据库q接cdhttp://www.shnenglu.com/lovefeel2004/archive/2010/06/02/116946.htmlq梦新媄(jing)q梦新媄(jing)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#Feedback1http://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极ؓ(f)的方ѝ?/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?x)根据这个宏定义来初始化数据库连接的环境?/span>

相关的宏定义列表 http://otl.sourceforge.net/otl3_compile.htm

如:(x) #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梦新媄(jing)q梦新媄(jing)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没有那么多的硬盘(sh)用量Q统一的inlude和lib目录Q你熟?zhn)命o(h)行,不用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?x)被复制?usr/local/bin/bjam?br>
现在你可以用bjam~译boost?jin)?br>
cd ../../..
bjam -sTOOLS=gcc install

~译旉不会(x)如windows那么长久Q在我的?sh)脑上编译?jin)大约40分钟。你可以在前后用df命o(h)(g)查下盘?sh)用Q在我的?sh)脑上,~译boostp?00M的空间?br>
使用install?x)把头文件复制?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(jin)使其能够在登录时自动导入Q你可以写一个脚本:(x)
#!/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

其保存?sh)?etc/profile.d/boost.shQƈ使用chmod a+x boost.sh讄执行权限?br>
现在我们可以写两D代码来试?jin)?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改ؓ(f)$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指定?jin)链接库?br>
现在boost的基本安装配|已l完成,但是我们可以再改q下?br>
如果不想每次都指定boost头文件目录,可以其link?usr/include中:(x)

ln -s /opt/boost_1_33_1/boost /usr/include/boost

或者:(x)

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(h)?x)清除编译时的中间文Ӟ?usr/local/lib下带版本L(fng)boost libsQ和/usr/local/include下的boost头文件。但是同时节省了(jin)几百M的硬盘空间?br>
所以如果你使用?jin)cleanQ记得将BOOST_INCLUDE更ؓ(f)BOOST_ROOTQ?opt/boost_1_33_1Q,?/usr/include/boost link?opt/boost_1_33_1/boostQ再有就是编译链接时的boost lib不要带版本号?br>
如果你觉得编译时手动链接敲那么长的名字比较麻?ch),可以使用脚本来自动寻N接:(x)

#!/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(h)假设boost头文件在/usr/include中,如果假设不成立,误行修改脚本此行:(x)
cmd = 'g++ %s %s -o %s' % (' '.join(files), libline, obj)

Z前的注释行:(x)
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会(x)自动修改输出的文件名?.cpp的文件名Q如lex.cpp输出lexQ,如果不需要,请将下面的代码:(x)
cmd = 'g++ %s %s -o %s' % (' '.join(files), libline, obj)

改ؓ(f)Q?br>
cmd = 'g++ %s %s' % (' '.join(files), libline)


Boost安装历程x(chng)基本l束?/span>


]]>
在Linuxpȝ中安装和配置ACE(?http://www.shnenglu.com/lovefeel2004/archive/2010/06/01/116942.htmlq梦新媄(jing)q梦新媄(jing)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

本文详细描述?jin)在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它?

 

   升的步骤如下:(x)

 

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序
开始安装:(x)

 

l过上面的准备工作,现在你已l具备了(jin)安装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的目录下?x)徏立一个名为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可以很好的工作?jin)?br>../configure
5.在O长的(g)查和配置之后Q如果没有什么问题,你就可以开始编译了(jin)Q如果要让ace支持ICMP 和对c++库的支持Q需要在config.h头文件中加上#define ACE_HAS_STANDARD_CPP_LIBRARY 1 ?define ACE_HAS_ICMP_SUPPORT 1Q?br>q一步很单,执行
make
然后Q(chng)一杯茶Q静(rn)?rn)的{待p?jin)?br>6.如果~译利的通过(通常都会(x)是这L(fng))Q那么恭喜你Q你已经成功?jin)一大半?jin),下面要做的仅仅是以些配置工作而已?br>接下来的工作是安装,q一步是可选的Q目的是把编译生成的ACE的库文g、头文g和手册页{安装到/usr/local的相应目录中去,Z(jin)今后使用的方便,我徏议你q是q行q一步,执行
su
root's password
make install
7.安装之后Q我们就可以q行最后的配置工作?jin)?br>首先讄环境变量ACE_ROOTQ执?br>setenv ACE_ROOT /home/zhc/ace/ACE_wrappers
注意其中的\径要Ҏ(gu)你的实际情况而定
如果你不x(chng)ơ都手工讑֮路径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(jin)(zhn)的pȝ上了(jin)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序(随便哪一个都?和一个客L(fng)E序(Logging_Client)Q如果程序运行正,说明前面的安装和配置成功Q下面你可以开始你的ACE学习(fn)之旅?/span>


]]>
开始C++的历E?/title><link>http://www.shnenglu.com/lovefeel2004/archive/2009/08/28/94701.html</link><dc:creator>q梦新媄(jing)</dc:creator><author>q梦新媄(jing)</author><pubDate>Fri, 28 Aug 2009 13:25:00 GMT</pubDate><guid>http://www.shnenglu.com/lovefeel2004/archive/2009/08/28/94701.html</guid><wfw:comment>http://www.shnenglu.com/lovefeel2004/comments/94701.html</wfw:comment><comments>http://www.shnenglu.com/lovefeel2004/archive/2009/08/28/94701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/lovefeel2004/comments/commentRss/94701.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lovefeel2004/services/trackbacks/94701.html</trackback:ping><description><![CDATA[今天正式开始~~ <img src ="http://www.shnenglu.com/lovefeel2004/aggbug/94701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lovefeel2004/" target="_blank">q梦新媄(jing)</a> 2009-08-28 21:25 <a href="http://www.shnenglu.com/lovefeel2004/archive/2009/08/28/94701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.kdele.cn" target="_blank">AëƬþ</a>| <a href="http://www.013s.cn" target="_blank">þþþƷһ</a>| <a href="http://www.efineit.cn" target="_blank">yy6080þ</a>| <a href="http://www.saxie.cn" target="_blank">ƷþþþþþþѼ</a>| <a href="http://www.s36mbtm.cn" target="_blank">Ʒþøһ</a>| <a href="http://www.hhhkk.cn" target="_blank">Ʒʾþþþ999Ұ</a>| <a href="http://www.d8950.cn" target="_blank">鶹ƷþþƷɫۺ</a>| <a href="http://www.366509.cn" target="_blank">߳߳þþ91 </a>| <a href="http://www.aijialicai.com.cn" target="_blank">2021þþƷ</a>| <a href="http://www.danongyao.cn" target="_blank">þþþþþþþ</a>| <a href="http://www.a737.cn" target="_blank">þþþAVרվ</a>| <a href="http://www.ohos33.cn" target="_blank">޹㽶þþþþ</a>| <a href="http://www.aikandianying.cn" target="_blank">þþþþþƷͼƬ</a>| <a href="http://www.qiuhen.cn" target="_blank">þþѹ۳ӰԺ</a>| <a href="http://www.veixzew.cn" target="_blank">97㽶þҹɫƷ </a>| <a href="http://www.dnf530.cn" target="_blank">޾Ʒھþ</a>| <a href="http://www.ccco.org.cn" target="_blank">޹Ʒþ66</a>| <a href="http://www.diy800.cn" target="_blank">ŷպƷþþѹۿ</a>| <a href="http://www.qxri.cn" target="_blank">ƷþþĻ</a>| <a href="http://www.zzrich.cn" target="_blank">ƷŮþþþ</a>| <a href="http://www.puhb.cn" target="_blank">þ2019Ļ</a>| <a href="http://www.sh-yd.com.cn" target="_blank">þþþþŮ</a>| <a href="http://www.63552277.cn" target="_blank">91Ʒþþþþio</a>| <a href="http://www.taobaoluntan.net.cn" target="_blank">պþþþƷӰԺҳ</a>| <a href="http://www.job158.cn" target="_blank">㽶þþþþúݺɫ</a>| <a href="http://www.micgroup.cn" target="_blank">˾þAV</a>| <a href="http://www.21chem.cn" target="_blank">ŷպ˾Ʒþþѿ</a>| <a href="http://www.fengguan1688.cn" target="_blank">޾ƷƷþ99һ</a>| <a href="http://www.po18h.cn" target="_blank">ƷŷƬþùŷ</a>| <a href="http://www.jfjn.net.cn" target="_blank">þˬˬˬ</a>| <a href="http://www.571jia.cn" target="_blank">þù׾Ʒǿ</a>| <a href="http://www.1hkl.cn" target="_blank">㽶þҹɫƷ</a>| <a href="http://www.tprs.com.cn" target="_blank">þѸƵ</a>| <a href="http://www.4gbbs.cn" target="_blank">þþþþþòҰ¸߳</a>| <a href="http://www.fscre.cn" target="_blank">aëƬþѲ</a>| <a href="http://www.cnmncom.cn" target="_blank">ƯޱгĻþ</a>| <a href="http://www.popotang.cn" target="_blank">þ91Ʒ91þ鶹 </a>| <a href="http://www.wannengsou.cn" target="_blank">þ㽶ۺɫһۺɫ88</a>| <a href="http://www.517down.cn" target="_blank">Ӱ7777þþƷˬ</a>| <a href="http://www.webfi.cn" target="_blank">7ŷպۺľþþþ</a>| <a href="http://www.dnnmodules.cn" target="_blank">ŷѹۿþ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>