在電腦常用操作中,我們經(jīng)常會用到CentOS常用命令。所以,我們對一些經(jīng)常使用又很重要的CentOS常用命令進(jìn)行了全面的整理。下面,就給大家介紹這些CentOS常用命令。
一:使用CentOS常用命令查看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
如果覺得需要看的更加舒服
grep "model name" /proc/cpuinfo | cut -f2 -d:
二:使用CentOS常用命令查看內(nèi)存
grep MemTotal /proc/meminfo grep MemTotal /proc/meminfo | cut -f2 -d: free -m |grep "Mem" | awk '{print $2}'
三:使用CentOS常用命令查看cpu是32位還是64位
查看CPU位數(shù)(32 or 64)
getconf LONG_BIT
四:使用CentOS常用命令查看當(dāng)前l(fā)inux的版本
more /etc/redhat-release
cat /etc/redhat-release
五:使用CentOS常用命令查看內(nèi)核版本
uname -r
uname -a
六:使用CentOS常用命令查看當(dāng)前時(shí)間
date上面已經(jīng)介紹如何同步時(shí)間了
七:使用CentOS常用命令查看硬盤和分區(qū)
df -h
fdisk -l
也可以查看分區(qū)
du -sh
可以看到全部占用的空間
du /etc -sh
可以看到這個(gè)目錄的大小
八:使用CentOS常用命令查看安裝的軟件包
查看系統(tǒng)安裝的時(shí)候裝的軟件包
cat -n /root/install.log
more /root/install.log | wc -l
查看現(xiàn)在已經(jīng)安裝了那些軟件包
rpm -qa
rpm -qa | wc -l
yum list installed | wc -l
不過很奇怪,我通過rpm,和yum這兩種方式查詢的安裝軟件包,數(shù)量并不一樣。沒有找到原因。
九:使用CentOS常用命令查看鍵盤布局
cat /etc/sysconfig/keyboard
cat /etc/sysconfig/keyboard | grep KEYTABLE | cut -f2 -d=
十:使用CentOS常用命令查看selinux情況
sestatus
sestatus | cut -f2 -d:
cat /etc/sysconfig/selinux
十一:使用CentOS常用命令查看ip,mac地址
在ifcfg-eth0 文件里你可以看到mac,網(wǎng)關(guān)等信息。 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}' 查看網(wǎng)關(guān) cat /etc/sysconfig/network 查看dns cat /etc/resolv.conf 十二:使用CentOS常用命令查看默認(rèn)語言
echo $LANG $LANGUAGE
cat /etc/sysconfig/i18n
十二:使用CentOS常用命令查看所屬時(shí)區(qū)和是否使用UTC時(shí)間
cat /etc/sysconfig/clock
十三:使用CentOS常用命令查看主機(jī)名
hostname
cat /etc/sysconfig/network
修改主機(jī)名就是修改這個(gè)文件,同時(shí)最好也把host文件也修改。
十四:使用CentOS常用命令查看開機(jī)運(yùn)行時(shí)間
uptime
09:44:45 up 67 days, 23:32, ...
看來剛才確實(shí)是網(wǎng)段的問題,我的機(jī)器還是67天前開機(jī)的。
#系統(tǒng)資源使用情況
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
第一部分
安裝linux
1. 操作系統(tǒng)的安裝省略,注意配置圖形界面
2. 驗(yàn)證安裝
通過運(yùn)行以下命令檢查內(nèi)核版本:
uname –r
其他所需程序包的版本(或更高版本):
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
以上為可選程序包,最好安裝上
要查看系統(tǒng)上安裝了這些程序包的哪些版本,以 root 用戶身份運(yùn)行以下命令:
rpm -q gcc make binutils openmotif setarch compat-db compat-gcc compat-gcc-c++
compat-libstdc++ compat-libstdc++-devel
第二部分:針對 Oracle 配置 Linux
1. 驗(yàn)證系統(tǒng)要求
要驗(yàn)證系統(tǒng)是否滿足 Oracle 10g 數(shù)據(jù)庫的最低要求,以 root 用戶身份登錄并運(yùn)行以下命令。
要查看可用 RAM 和交換空間大小,運(yùn)行以下命令:
grep MemTotal /proc/meminfo
grep SwapTotal /proc/meminfo
所需最小 RAM 為 512MB,而所需最小交換空間為 1GB.對于 RAM 小于或等于 2GB 的系統(tǒng),交換空間應(yīng)為 RAM 數(shù)量的兩倍;對于 RAM 大于
2GB 的系統(tǒng),交換空間應(yīng)為 RAM 數(shù)量的一到兩倍。
Oracle 10g 軟件還需要 2.5GB 的可用磁盤空間,而數(shù)據(jù)庫則另需 1.2GB
的可用磁盤空間。/tmp 目錄至少需要 400MB 的可用空間。要檢查系統(tǒng)上的可用磁盤空間,運(yùn)行以下命令:
df –h
2. 創(chuàng)建 Oracle 組和用戶帳戶
接下來,創(chuàng)建用于安裝和維護(hù) Oracle 10g 軟件的 Linux 組和用戶帳戶。用戶帳戶將稱為 oracle,而組將稱為 oinstall 和 dba.以
root 用戶身份執(zhí)行以下命令:
/usr/sbin/groupadd oinstall
/usr/sbin/groupadd dba
/usr/sbin/useradd -m -g oinstall -G dba oracle
設(shè)置 oracle 帳戶的口令:
passwd oracle
3. 創(chuàng)建目錄
現(xiàn)在,創(chuàng)建存儲 Oracle 10g 軟件和數(shù)據(jù)庫文件的目錄。本指南在創(chuàng)建目錄結(jié)構(gòu)時(shí)所用的命名慣例符合最佳靈活結(jié)構(gòu) (OFA) 規(guī)范。有關(guān) OFA
標(biāo)準(zhǔn)的更多信息,請參閱針對 UNIX 系統(tǒng)的 Oracle 數(shù)據(jù)庫 10g 安裝指南 的附錄 D.
以下假設(shè)在根文件系統(tǒng)中創(chuàng)建目錄。這樣做是為了簡便起見,不建議將其作為通用做法。這些目錄通常被創(chuàng)建為單獨(dú)的文件系統(tǒng)。
以 root 用戶身份執(zhí)行以下命令:
mkdir -p /u01/app/oracle
mkdir -p /u02/oradata
chown -R oracle:oinstall /u01/app/oracle /u02/oradata
chmod -R 775 /u01/app/oracle /u02/oradata
4. 配置 Linux 內(nèi)核參數(shù)
Linux 內(nèi)核非常出色。與大多數(shù)其他 *NIX 系統(tǒng)不同,Linux
允許在系統(tǒng)啟動和運(yùn)行時(shí)修改大多數(shù)內(nèi)核參數(shù)。完成內(nèi)核參數(shù)更改后不必重新啟動系統(tǒng)。Oracle 數(shù)據(jù)庫 10g
需要以下所示的內(nèi)核參數(shù)設(shè)置。其中給出的是最小值,因此如果您的系統(tǒng)使用的值較大,則不要更改它。
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
如果您正確的安裝了linux,且內(nèi)核參數(shù)全部采用默認(rèn)值,則只需在以 root 用戶身份登錄后執(zhí)行下命令。
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 用戶身份運(yùn)行以下命令來驗(yàn)證您的設(shè)置:
/sbin/sysctl -a | grep shm
/sbin/sysctl -a | grep sem
/sbin/sysctl -a | grep file-max
/sbin/sysctl -a | grep ip_local_port_range
如果系統(tǒng)的參數(shù)設(shè)置的比上述參數(shù)值小,則編輯 /etc/sysctl.conf 文件,添加或更改這些參數(shù)。完成后,運(yùn)行以下命令激活更改:
/sbin/sysctl –p
5. 為 oracle 用戶設(shè)置 Shell 限制
Oracle 建議對每個(gè) Linux 帳戶可以使用的進(jìn)程數(shù)和打開的文件數(shù)設(shè)置限制。要進(jìn)行這些更改,以 root 用戶的身份執(zhí)行下列命令:
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" ]; then
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
EOF
cat >> /etc/csh.login <<EOF
if ( \$USER == "oracle" ) then
limit maxproc 16384
limit descriptors 65536
umask 022
endif
EOF
6. oracle 用戶的環(huán)境變量
要使用 Oracle 產(chǎn)品,應(yīng)該或必須設(shè)置幾個(gè)環(huán)境變量。對于數(shù)據(jù)庫服務(wù)器,建議設(shè)置以下環(huán)境變量:
ORACLE_BASE
ORACLE_HOME
ORACLE_SID
PATH
如果您在同一服務(wù)器上安裝了多個(gè) Oracle 產(chǎn)品或數(shù)據(jù)庫,則 ORACLE_HOME、ORACLE_SID 和 PATH
變量可能會更改。ORACLE_BASE 變量不應(yīng)更改,并可以在需要時(shí)在您的登錄配置文件中設(shè)置它。Oracle 提供了一個(gè)稱作 oraenv
的實(shí)用程序來設(shè)置其他變量。
以 oracle 身份登錄,并通過在 .bash_profile中添加以下行:
TMP=/tmp;
export TMP
TMPDIR=$TMP;
export TMPDIR
ORACLE_BASE=/u01/app/oracle;
export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/oracle/product/10.2.0/db_1;
export ORACLE_HOME
ORACLE_SID=mydb;
export ORACLE_SID
ORACLE_TERM=xterm;
export ORACLE_TERM
PATH=/usr/sbin:$PATH;
export PATH
PATH=$ORACLE_HOME/bin:$PATH;
export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib;
export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib;
export CLASSPATH
NLS_LANG="Simplified Chinese_china".ZHS16GBK;
export NLS_LANG
此更改將在您下次登錄到 oracle 帳戶時(shí)生效。
第三部分:安裝 Oracle
1.安裝軟件
使用 oracle 帳戶登錄。
將目錄更改為 Oracle 10g 軟件解壓縮到的位置。
啟動 Oracle 通用安裝程序。
$ ./runInstaller
1)歡迎
Ø 單擊 Next.
2)指定清單目錄和證書
Ø 如果您一直在依循本指南中的步驟,則使用默認(rèn)值即可。否則,編輯清單目錄的路徑,以指向正確目錄。
Ø 操作系統(tǒng)組名稱應(yīng)為 oinstall.
3)如果這是首次在此機(jī)器上安裝 Oracle,則您將收到一個(gè)彈出窗口,提示需要以 root 用戶身份運(yùn)行 orainstRoot.sh 腳本。以 root
用戶身份登錄,更改到窗口中指定的目錄,執(zhí)行該腳本,然后繼續(xù)操作。
4)指定文件位置
Ø 如果您一直在依循本指南中的步驟,則使用默認(rèn)值即可。否則,在繼續(xù)操作前確保源路徑和目標(biāo)路徑正確。
5)選擇安裝類型
Ø 接受默認(rèn)值 Enterprise Edition.
6)與特定產(chǎn)品相關(guān)的先決條件的檢查
Ø
如果您一直在依循本指南中的步驟,則所有檢查都應(yīng)順利通過。如果一個(gè)或多個(gè)檢查失敗,則在繼續(xù)操作前糾正該問題。
7)選擇數(shù)據(jù)庫配置
Ø 接受默認(rèn)值 Create a starter database 和 General Purpose.
8)指定數(shù)據(jù)庫配置選項(xiàng)
Ø 輸入數(shù)據(jù)庫的全局?jǐn)?shù)據(jù)庫名稱。該名稱應(yīng)包含 ORACLE_SID 和服務(wù)器域名(例如,demo1.orademo.org,其中 demo1 是 ORACLE_SID,orademo.org
是域名)。
Ø 輸入全局?jǐn)?shù)據(jù)庫名稱時(shí),SID 框?qū)⒆詣犹畛洹?/p>
Ø 接受默認(rèn)的數(shù)據(jù)庫字符集。
Ø 選擇 Create database with sample schemas.
9)選擇數(shù)據(jù)庫管理選項(xiàng)
Ø 選擇 Use Database Control for Database Management.
10)指定數(shù)據(jù)庫文件存儲選項(xiàng)
Ø 選擇 File System,然后輸入數(shù)據(jù)庫文件要使用的路徑名(在本例中為 /u02/oradata)。
11)指定備份和恢復(fù)選項(xiàng)
Ø 選擇 Do not enable Automated backups.
12)指定數(shù)據(jù)庫模式口令
Ø 選擇 Use the same password for all the accounts.
Ø 選擇一個(gè)口令,然后輸入兩次進(jìn)行確認(rèn)。
13)摘要
Ø 顯示已安裝產(chǎn)品的摘要。
單擊 Install.
1.人之所以痛苦,在于追求錯(cuò)誤的東西。
2.如果你不給自己煩惱,別人也永遠(yuǎn)不可能給你煩惱。因?yàn)槟阕约旱膬?nèi)心,你放不下。
3.你永遠(yuǎn)要感謝給你逆境的眾生。
4.你永遠(yuǎn)要寬恕眾生,不論他有多壞,甚至他傷害過你,你一定要放下,才能得到真正的快樂。
5.當(dāng)你快樂時(shí),你要想這快樂不是永恒的。當(dāng)你痛苦時(shí),你要想這痛苦也不是永恒的。
6.今日的執(zhí)著,會造成明日的后悔。
7.你可以擁有愛,但不要執(zhí)著,因?yàn)榉蛛x是必然的。
8.不要浪費(fèi)你的生命在你一定會后悔的地方上。
9.你什么時(shí)候放下,什么時(shí)候就沒有煩惱。
10.每一種創(chuàng)傷,都是一種成熟。
11.狂妄的人有救,自卑的人沒有救,認(rèn)識自己,降伏自己,改變自己,才能改變別人。
12.你不要一直不滿人家,你應(yīng)該一直檢討自己才對。不滿人家,是苦了你自己。
13.一個(gè)人如果不能從內(nèi)心去原諒別人,那他就永遠(yuǎn)不會心安理得。
14.心中裝滿著自己的看法與想法的人,永遠(yuǎn)聽不見別人的心聲。
15.毀滅人只要一句話,培植一個(gè)人卻要千句話,請你多口下留情。
16.根本不必回頭去看咒罵你的人是誰?如果有一條瘋狗咬你一口,難道你也要趴下去反咬他一口嗎?
17.永遠(yuǎn)不要浪費(fèi)你的一分一秒,去想任何不喜歡你的人。
18.請你用慈悲心和溫和的態(tài)度,把你的不滿與委屈說出來,別人就容易接受。
19.同樣的瓶子,你為什么要裝毒藥呢?同樣的心里,你為什么要充滿著煩惱呢?
20.得不到的東西,我們會一直以為他是美好的,那是因?yàn)槟銓λ私馓伲瑳]有時(shí)間與他相處在一起。當(dāng)有一天,你深入了解后,你會發(fā)現(xiàn)原不是你想像中的那么美好。
21.活著一天,就是有福氣,就該珍惜。當(dāng)我哭泣我沒有鞋子穿的時(shí)候,我發(fā)現(xiàn)有人卻沒有腳。
22.多一分心力去注意別人,就少一分心力反省自己,你懂嗎?
23.憎恨別人對自己是一種很大的損失。
24.每一個(gè)人都擁有生命,但并非每個(gè)人都懂得生命,乃至于珍惜生命。不了解生命的人,生命對他來說,是一種懲罰。
25.情執(zhí)是苦惱的原因,放下情執(zhí),你才能得到自在
26.不要太肯定自己的看法,這樣子比較少后悔。
27.當(dāng)你對自己誠實(shí)的時(shí)候,世界上沒有人能夠欺騙得了你。
28.用傷害別人的手段來掩飾自己缺點(diǎn)的人,是可恥的。
29.默默的關(guān)懷與祝福別人,那是一種無形的布施。
30.不要刻意去猜測他人的想法,如果你沒有智慧與經(jīng)驗(yàn)的正確判斷,通常都會有錯(cuò)誤的。
31.要了解一個(gè)人,只需要看他的出發(fā)點(diǎn)與目的地是否相同,就可以知道他是否真心的。
32.人生的真理,只是藏在平淡無味之中。
33.不洗澡的人,硬擦香水是不會香的。名聲與尊貴,是來自于真才實(shí)學(xué)的。有德自然香。
34.時(shí)間總會過去的,讓時(shí)間流走你的煩惱吧!
35.你硬要把單純的事情看得很嚴(yán)重,那樣子你會很痛苦。
36.永遠(yuǎn)扭曲別人善意的人,無藥可救。
37.說一句謊話,要編造十句謊話來彌補(bǔ),何苦呢?
38.白白的過一天,無所事事,就像犯了竊盜罪一樣
39.廣結(jié)眾緣,就是不要去傷害任何一個(gè)人。
40.沉默是毀謗最好的答覆。
41.對人恭敬,就是在莊嚴(yán)你自己。
42.擁有一顆無私的愛心,便擁有了一切。
43.來是偶然的,走是必然的。所以你必須,隨緣不變,不變隨緣。
44.慈悲是你最好的武器。
45.只要面對現(xiàn)實(shí),你才能超越現(xiàn)實(shí)。
46.良心是每一個(gè)人最公正的審判官,你騙得了別人,卻永遠(yuǎn)騙不了你自己的良心。
47.不懂得自愛的人,是沒有能力去愛別人的。
48.有時(shí)候我們要冷靜問問自已,我們在追求什么?我們活著為了什么?
49.不要因?yàn)樾⌒〉臓巿?zhí),遠(yuǎn)離了你至親的好友,也不要因?yàn)樾⌒〉脑购蓿浟藙e人的大恩。
50.感謝上蒼我所擁有的,感謝上蒼我所沒有的。
51.凡是能站在別人的角度為他人著想,這個(gè)就是慈悲。
52.說話不要有攻擊性,不要有殺傷力,不夸已能,不揚(yáng)人惡,自然能化敵為友。
53.誠實(shí)的面對你內(nèi)心的矛盾和污點(diǎn),不要欺騙你自己。
54.因果不曾虧欠過我們什么,所以請不要抱怨。
55.大多數(shù)的人一輩子只做了三件事;自欺、欺人、被人欺。
56.心是最大的騙子,別人能騙你一時(shí),而它卻會騙你一輩子
57.只要自覺心安,東西南北都好。如有一人未度,切莫自己逃了。
58.當(dāng)你手中抓住一件東西不放時(shí),你只能擁有這件東西,如果你肯放手,你就有機(jī)會選擇別的。人的心若死執(zhí)自己的觀念,不肯放下,那么他的智慧也只能達(dá)到某種程度而已
59.如果你能夠平平安安的渡過一天,那就是一種福氣了。多少人在今天已經(jīng)見不到明天的太陽,多少人在今天已經(jīng)成了殘廢,多少人在今天已經(jīng)失去了自由,多少人在今天已經(jīng)家破人亡。
60.你有你的生命觀,我有我的生命觀,我不干涉你。只要我能,我就感化你。如果不能,那我就認(rèn)命。
61.你希望掌握永恒,那你必須控制現(xiàn)在。
62.惡口永遠(yuǎn)不要出自于我們的口中,不管他有多壞,有多惡。你愈罵他,你的心就被污染了,你要想,他就是你的善知識。
63.別人可以違背因果,別人可以害我們,打我們,毀謗我們。可是我們不能因此而憎恨別人,為什么?我們一定要保有一顆完整的本性和一顆清凈的心。
64.如果一個(gè)人沒有苦難的感受,就不容易對他人給予同情。你要學(xué)救苦救難的精神,就得先受苦受難。
65.世界原本就不是屬于你,因此你用不著拋棄,要拋棄的是一切的執(zhí)著。萬物皆為我所用,但非我所屬。
66.雖然我們不能改變周遭的世界,我們就只好改變自己,用慈悲心和智慧心來面對這一切。
介紹
這篇文章的目的是為了介紹std::vector,如何恰當(dāng)?shù)厥褂盟鼈兊某蓡T函數(shù)等操作。本文中還討論了條件函數(shù)和函數(shù)指針在迭代算法中使用,如在remove_if()和for_each()中的使用。通過閱讀這篇文章讀者應(yīng)該能夠有效地使用vector容器,而且應(yīng)該不會再去使用C類型的動態(tài)數(shù)組了。
Vector總覽
vector是C++標(biāo)準(zhǔn)模板庫中的部分內(nèi)容,它是一個(gè)多功能的,能夠操作多種數(shù)據(jù)結(jié)構(gòu)和算法的模板類和函數(shù)庫。vector之所以被認(rèn)為是一個(gè)容器,是因?yàn)樗軌蛳袢萜饕粯哟娣鸥鞣N類型的對象,簡單地說,vector是一個(gè)能夠存放任意類型的動態(tài)數(shù)組,能夠增加和壓縮數(shù)據(jù)。
為了可以使用vector,必須在你的頭文件中包含下面的代碼:
vector屬于std命名域的,因此需要通過命名限定,如下完成你的代碼:
using std::vector;
vector<int> vInts;
|
或者連在一起,使用全名:
建議使用全局的命名域方式:
在后面的操作中全局的命名域方式會造成一些問題。vector容器提供了很多接口,在下面的表中列出vector的成員函數(shù)和操作。
Vector成員函數(shù)
函數(shù)
|
表述
|
c.assign(beg,end)
c.assign(n,elem)
|
將[beg; end)區(qū)間中的數(shù)據(jù)賦值給c。
將n個(gè)elem的拷貝賦值給c。
|
c.at(idx)
|
傳回索引idx所指的數(shù)據(jù),如果idx越界,拋出out_of_range。
|
c.back()
|
傳回最后一個(gè)數(shù)據(jù),不檢查這個(gè)數(shù)據(jù)是否存在。
|
c.begin()
|
傳回迭代器重的可一個(gè)數(shù)據(jù)。
|
c.capacity()
|
返回容器中數(shù)據(jù)個(gè)數(shù)。
|
c.clear()
|
移除容器中所有數(shù)據(jù)。
|
c.empty()
|
判斷容器是否為空。
|
c.end()
|
指向迭代器中的最后一個(gè)數(shù)據(jù)地址。
|
c.erase(pos)
c.erase(beg,end)
|
刪除pos位置的數(shù)據(jù),傳回下一個(gè)數(shù)據(jù)的位置。
刪除[beg,end)區(qū)間的數(shù)據(jù),傳回下一個(gè)數(shù)據(jù)的位置。
|
c.front()
|
傳回地一個(gè)數(shù)據(jù)。
|
get_allocator
|
使用構(gòu)造函數(shù)返回一個(gè)拷貝。
|
c.insert(pos,elem)
c.insert(pos,n,elem)
c.insert(pos,beg,end)
|
在pos位置插入一個(gè)elem拷貝,傳回新數(shù)據(jù)位置。
在pos位置插入n個(gè)elem數(shù)據(jù)。無返回值。
在pos位置插入在[beg,end)區(qū)間的數(shù)據(jù)。無返回值。
|
c.max_size()
|
返回容器中最大數(shù)據(jù)的數(shù)量。
|
c.pop_back()
|
刪除最后一個(gè)數(shù)據(jù)。
|
c.push_back(elem)
|
在尾部加入一個(gè)數(shù)據(jù)。
|
c.rbegin()
|
傳回一個(gè)逆向隊(duì)列的第一個(gè)數(shù)據(jù)。
|
c.rend()
|
傳回一個(gè)逆向隊(duì)列的最后一個(gè)數(shù)據(jù)的下一個(gè)位置。
|
c.resize(num)
|
重新指定隊(duì)列的長度。
|
c.reserve()
|
保留適當(dāng)?shù)娜萘俊?/span>
|
c.size()
|
返回容器中實(shí)際數(shù)據(jù)的個(gè)數(shù)。
|
c1.swap(c2)
swap(c1,c2)
|
將c1和c2元素互換。
同上操作。
|
vector<Elem> c
vector <Elem> c1(c2)
vector <Elem> c(n)
vector <Elem> c(n, elem)
vector <Elem> c(beg,end)
c.~ vector <Elem>()
|
創(chuàng)建一個(gè)空的vector。
復(fù)制一個(gè)vector。
創(chuàng)建一個(gè)vector,含有n個(gè)數(shù)據(jù),數(shù)據(jù)均已缺省構(gòu)造產(chǎn)生。
創(chuàng)建一個(gè)含有n個(gè)elem拷貝的vector。
創(chuàng)建一個(gè)以[beg;end)區(qū)間的vector。
銷毀所有數(shù)據(jù),釋放內(nèi)存。
|
Vector操作
函數(shù)
|
描述
|
operator[]
|
返回容器中指定位置的一個(gè)引用。
|
創(chuàng)建一個(gè)vector
vector容器提供了多種創(chuàng)建方法,下面介紹幾種常用的。
創(chuàng)建一個(gè)Widget類型的空的vector對象:
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.
|
創(chuàng)建一個(gè)包含500個(gè)Widget類型數(shù)據(jù)的vector:
vector<Widget> vWidgets(500);
|
創(chuàng)建一個(gè)包含500個(gè)Widget類型數(shù)據(jù)的vector,并且都初始化為0:
vector<Widget> vWidgets(500, Widget(0));
|
創(chuàng)建一個(gè)Widget的拷貝:
vector<Widget> vWidgetsFromAnother(vWidgets);
|
向vector添加一個(gè)數(shù)據(jù)
vector添加數(shù)據(jù)的缺省方法是push_back()。push_back()函數(shù)表示將數(shù)據(jù)添加到vector的尾部,并按需要來分配內(nèi)存。例如:向vector<Widget>中添加10個(gè)數(shù)據(jù),需要如下編寫代碼:
for(int i= 0;i<10; i++)
vWidgets.push_back(Widget(i));
|
獲取vector中制定位置的數(shù)據(jù)
很多時(shí)候我們不必要知道vector里面有多少數(shù)據(jù),vector里面的數(shù)據(jù)是動態(tài)分配的,使用push_back()的一系列分配空間常常決定于文件或一些數(shù)據(jù)源。如果你想知道vector存放了多少數(shù)據(jù),你可以使用empty()。獲取vector的大小,可以使用size()。例如,如果你想獲取一個(gè)vector v的大小,但不知道它是否為空,或者已經(jīng)包含了數(shù)據(jù),如果為空想設(shè)置為-1,你可以使用下面的代碼實(shí)現(xiàn):
int nSize = v.empty() ? -1 : static_cast<int>(v.size());
|
訪問vector中的數(shù)據(jù)
使用兩種方法來訪問vector。
1、 vector::at()
2、 vector::operator[]
operator[]主要是為了與C語言進(jìn)行兼容。它可以像C語言數(shù)組一樣操作。但at()是我們的首選,因?yàn)?/span>at()進(jìn)行了邊界檢查,如果訪問超過了vector的范圍,將拋出一個(gè)例外。由于operator[]容易造成一些錯(cuò)誤,所有我們很少用它,下面進(jìn)行驗(yàn)證一下:
分析下面的代碼:
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()分配了10個(gè)int型的空間,但并不沒有初始化。如下圖所示:

你可以在這個(gè)代碼中嘗試不同條件,觀察它的結(jié)果,但是無論何時(shí)使用at(),都是正確的。
刪除vector中的數(shù)據(jù)
vector能夠非常容易地添加數(shù)據(jù),也能很方便地取出數(shù)據(jù),同樣vector提供了erase(),pop_back(),clear()來刪除數(shù)據(jù),當(dāng)你刪除數(shù)據(jù)的時(shí)候,你應(yīng)該知道要?jiǎng)h除尾部的數(shù)據(jù),或者是刪除所有數(shù)據(jù),還是個(gè)別的數(shù)據(jù)。在考慮刪除等操作之前讓我們靜下來考慮一下在STL中的一些應(yīng)用。
Remove_if()算法
現(xiàn)在我們考慮操作里面的數(shù)據(jù)。如果要使用remove_if(),我們需要在頭文件中包含如下代碼::
Remove_if()有三個(gè)參數(shù):
1、 iterator _First:指向第一個(gè)數(shù)據(jù)的迭代指針。
2、 iterator _Last:指向最后一個(gè)數(shù)據(jù)的迭代指針。
3、 predicate _Pred:一個(gè)可以對迭代操作的條件函數(shù)。
條件函數(shù)
條件函數(shù)是一個(gè)按照用戶定義的條件返回是或否的結(jié)果,是最基本的函數(shù)指針,或者是一個(gè)函數(shù)對象。這個(gè)函數(shù)對象需要支持所有的函數(shù)調(diào)用操作,重載operator()()操作。remove_if()是通過unary_function繼承下來的,允許傳遞數(shù)據(jù)作為條件。
例如,假如你想從一個(gè)vector<CString>中刪除匹配的數(shù)據(jù),如果字串中包含了一個(gè)值,從這個(gè)值開始,從這個(gè)值結(jié)束。首先你應(yīng)該建立一個(gè)數(shù)據(jù)結(jié)構(gòu)來包含這些數(shù)據(jù),類似代碼如下:
#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;
|
然后處理?xiàng)l件判斷:
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;
};
|
通過這個(gè)操作你可以從vector中有效地刪除數(shù)據(jù):
// 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()能做什么?
你可能會疑惑,對于上面那個(gè)例子在調(diào)用remove_if()的時(shí)候還要使用erase()呢?這是因?yàn)榇蠹也⒉皇煜?/span>STL中的算法。Remove(),remove_if()等所有的移出操作都是建立在一個(gè)迭代范圍上的,那么不能操作容器中的數(shù)據(jù)。所以在使用remove_if(),實(shí)際上操作的時(shí)容器里數(shù)據(jù)的上面的。思考上面的例子:
1、 szRemove = “o”.
2、 vs見下面圖表中的顯示。

觀察這個(gè)結(jié)果,我們可以看到remove_if()實(shí)際上是根據(jù)條件對迭代地址進(jìn)行了修改,在數(shù)據(jù)的后面存在一些殘余的數(shù)據(jù),那些需要?jiǎng)h除的數(shù)據(jù)。剩下的數(shù)據(jù)的位置可能不是原來的數(shù)據(jù),但他們是不知道的。
調(diào)用erase()來刪除那些殘余的數(shù)據(jù)。注意上面例子中通過erase()刪除remove_if()的結(jié)果和vs.enc()范圍的數(shù)據(jù)。
壓縮一個(gè)臃腫的vector
很多時(shí)候大量的刪除數(shù)據(jù),或者通過使用reserve(),結(jié)果vector的空間遠(yuǎn)遠(yuǎn)大于實(shí)際需要的。所有需要壓縮vector到它實(shí)際的大小。resize()能夠增加vector的大小。Clear()僅僅能夠改變緩存的大小,所有的這些對于vector釋放內(nèi)存等九非常重要了。如何來解決這些問題呢,讓我們來操作一下。
我們可以通過一個(gè)vector創(chuàng)建另一個(gè)vector。讓我們看看這將發(fā)生什么。假定我們已經(jīng)有一個(gè)vector v,它的內(nèi)存大小為1000,當(dāng)我們調(diào)用size()的時(shí)候,它的大小僅為7。我們浪費(fèi)了大量的內(nèi)存。讓我們在它的基礎(chǔ)上創(chuàng)建一個(gè)vector。
std::vector<CString> vNew(v);
cout << vNew.capacity();
|
vNew.capacity()返回的是7。這說明新創(chuàng)建的只是根據(jù)實(shí)際大小來分配的空間。現(xiàn)在我們不想釋放v,因?yàn)槲覀円谄渌胤接玫剿覀兛梢允褂?/span>swap()將v和vNew互相交換一下?
vNew.swap(v);
cout << vNew.capacity();
cout << v.capacity();
|
有趣的是:vNew.capacity()是1000,而v.capacity()是7。
現(xiàn)在是達(dá)到我的目的了,但是并不是很好的解決方法,我們可以像下面這么寫:
std::vector<CString>(v).swap(v);
|
你可以看到我們做了什么?我們創(chuàng)建了一個(gè)臨時(shí)變量代替那個(gè)命名的,然后使用swap(),這樣我們就去掉了不必要的空間,得到實(shí)際大小的v。
結(jié)論
我希望這個(gè)文檔可以給那些使用STL vector容器的開發(fā)者很有價(jià)值的參考。我也希望通過閱讀這篇文章你可以放心地使用vector來代替C語言中的數(shù)據(jù)了。
參考
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.