Cpp:using聲明和標(biāo)準(zhǔn)庫string

從這篇博客開始學(xué)習(xí)《C++ primer》的第三章“標(biāo)準(zhǔn)庫類型”。首先介紹命名空間的using聲明和第一種庫類型string。

一芍碧、using聲明


在本章之前所用到的標(biāo)準(zhǔn)庫類型都使用了 :: 操作符,該操作符是作用域操作符,如 std::cin遭商。但每次使用標(biāo)準(zhǔn)庫類型就需要添加 std:: 顯得非常麻煩,本節(jié)介紹一種安全的機(jī)制:using聲明捅伤。

使用using聲明可以不再需要添加 namespace_name::劫流,如下

using namespace::name

一旦使用了 using 聲明,后面就不要再次引用命名空間了:

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int main()
{
    cout << "Enter two Numbers:" << endl;
    int val1, val2;
    cin>> val1 >> val2;
    cout << "The sum of " << val1 << " and " << val2
            << " is " << val1+val2 << endl;
    return 0;
}

可以對比之前我們寫的程序丛忆,發(fā)現(xiàn)明顯可以簡潔很多祠汇。在接下來的例子中,我們均假設(shè)已經(jīng)提供了using聲明熄诡。

二可很、標(biāo)準(zhǔn)庫string類型


string 類型支持可變長度的字符串,我們不需要知道它的具體實(shí)現(xiàn)凰浮,只需要知道它提供的操作我抠。跟其他標(biāo)準(zhǔn)庫類型一樣,要使用也需要添加頭文件:

#include <string>
using std::string;

2.1袜茧、string對象的定義和初始化

string 標(biāo)準(zhǔn)庫支持幾個(gè)構(gòu)造函數(shù)菜拓,構(gòu)造函數(shù)是一個(gè)特殊成員函數(shù),定義如何初始化該類型的對象笛厦。下表列出了幾個(gè)構(gòu)造函數(shù)

string構(gòu)造函數(shù) -
string s1; 默認(rèn)構(gòu)造函數(shù)纳鼎,s1為空字符串
string s2(s1); 將s2初始化為s1的副本
string s3("value") 將s3初始化為 "value" 的副本
string s4(n,'c') 將s4初始化為含n個(gè) 'c' 的字符串

字符串的字面值與標(biāo)準(zhǔn)庫string類型不是同一種類型,需要注意!

2.2贱鄙、string對象的讀寫

跟前面的 iostream 標(biāo)準(zhǔn)庫的內(nèi)置類型 int劝贸,double相似:

//假設(shè)using聲明已經(jīng)提供
int main()
{
    string s;
    cin >> s;
    cout << s << endl;
    return 0;
}

string的輸入操作:

  • 讀取時(shí)忽略開頭所有的空白符(如空格,換行符逗宁,制表符)映九;
  • 讀取字符直至再次遇到空白符;

因此如果輸入的是 " hello world "(開頭和結(jié)尾都有空格)疙剑,上述程序輸出是 "hello"氯迂,下面程序輸出為 "helloworld"。

而且與前面類似言缤,可以把多個(gè)操作放在一起

string s1,s2;
cin >> s1 >> s2;
cout << s1 << s2 << endl;

另一個(gè)例子:讀取未知數(shù)目的string對象

string word;
while(cin >> word){    //輸入“ctrl+z”可以結(jié)束
    cout << word << endl;
}

跟上述程序相似的還有 string IO 操作:getline()嚼蚀。該函數(shù)接受兩個(gè)參數(shù):

  • 輸入流對象;
  • string對象管挟;

該函數(shù)是讀入輸入流的下一行轿曙,并保存在string對象中。但行中不包含 換行符僻孝,getline只要遇到換行符导帝,即便是輸入的第一個(gè)字符,getline也會(huì)停止讀入并返回穿铆。如果第一個(gè)字符是換行符您单,則string對象為空。

string word;
while(getline(cin,word)){    //輸入“ctrl+z”可以結(jié)束
    cout << word << endl;
}

2.3荞雏、string對象的操作

string的操作 -
s.empty() s為空返回true虐秦,否則返回false
s.size() 返回s中的字符個(gè)數(shù)
s[n] 范圍s中位置為n的字符,位置從0開始計(jì)數(shù)
s1 + s2 連接s1凤优,s2成一個(gè)新的字符串
s1 = s2 把s1的內(nèi)容替換成s2的內(nèi)容
s1 == s2 比較s1悦陋,s2的內(nèi)容,相等返回true筑辨,否則false
!=, <, <=, >, >= 就是這些符號表達(dá)的意思

1俺驶、size()和empty()

string s("ni hao\n");
if(!s.empty()){
    cout << "The size of" << s << "is" << s.size() << endl;
} else {
    cout << "empty!" << endl;
}

可以像上述程序一樣使用size(),empty()。

2棍辕、string::size_type類型

從前面來看暮现,size()返回的值似乎是int型,但實(shí)際上返回的是 string::size_type 類型痢毒。因?yàn)閕nt類型所能表示的范圍實(shí)在有限送矩,所以string類型定義了新的配套類型。

string s("hello world");
for(string::size_type i=0; i!=s.size(); ++i){
    cout << s[i] << endl;
}

一般來說使用 int 類型也能夠達(dá)到要求哪替,但最安全的方法是使用 string::size_type 類型。

3菇怀、string關(guān)系操作符

  • ==, !=:相等凭舶、不等
  • <, <=, >, >=:小于晌块、小于或等于、大于帅霜、大于或等于

比較兩個(gè)字符串時(shí)采用了和字典排序相同的策略(大小寫敏感):

  • 如果string對象長度不同匆背,且短的string對象與長的對象前面部分相同,則短的小于長的身冀;

  • 如果兩個(gè)string對象字符不同钝尸,則比較第一個(gè)不匹配的字符;

    string s1("hello");
    string s2("hello world");
    string s3("hey");
    cout << (s1 < s2) << ", " << (s1 < s3) << endl;

輸出結(jié)果

1, 1

表示 s1 小于 s2搂根,s1 小于 s3珍促。

4、相加

string s1("hello");
string s2("hey");

string s3 = s1 + s2;    //生成新字符串
s1 += s2;                //追加至s1末尾

5剩愧、與字符串字面值的連接

+ 操作符的左右操作數(shù)必須有一個(gè)是 string 類型“

string s1 = "hello";
string s2 = "world";
string s3 = s1 + s2;            //ok
string s4 = s1 + "world" + "!";    //ok
string s5 = "hello" + s2 + "!";    //ok
string s6 = "hello" + "world";    //error:兩個(gè)字面值不能相加
string s7 = "hello" + "," + s2;    //error

6猪叙、下標(biāo)操作

通過 [] 來取得string對象中的字符。且下標(biāo)操作可以做左值:

for(string::size_type i=0; i!=s.size(); ++i){
    s[i] = '*';    //注意是 '*'仁卷,不是 "*"
}

任意可以產(chǎn)生整數(shù)值的表達(dá)式都可以作為下標(biāo):

cout << s[2*2] << endl穴翩;

2.4、string對象中的字符處理

經(jīng)常需要對string對象中的單個(gè)字符處理锦积,這些處理的函數(shù)在頭文件 cctype 中定義

cctype定義的函數(shù) -
isalnum(c) c 是字母或數(shù)字芒帕,返回true
isalpha(c) c 是字母,返回true
iscntrl(c) c 是控制字符丰介,返回true
isdigit(c) c 是數(shù)字背蟆,返回true
isgraph(c) c 不是空格,但可打印基矮,返回true
isprint(c) c 是可打印字符淆储,返回true
ispunct(c) c 是標(biāo)點(diǎn)符號,返回true
isspace(c) c 是空白字符家浇,返回true
isxdigit(c) c 是十六進(jìn)制數(shù)本砰,返回true
islower(c) c 是小寫字母,返回true
isupper(c) c 是大寫字母钢悲,返回true
tolower(c) 若 c 是大寫字母点额,返回 c 的小寫形式;否則直接返回 c
toupper(c) 若 c 是小寫字母莺琳,返回 c 的大寫形式还棱;否則直接返回 c

舉例:

string s("hello world");
for(string::size_type i = 0; i != s.size(); ++i){
    s[i] = toupper(s[i]);
}
cout << s << endl;

輸出:

HELLO WORLD

END.


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挟伙,更是在濱河造成了極大的恐慌类溢,老刑警劉巖百框,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琳要,死亡現(xiàn)場離奇詭異寡具,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)稚补,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門童叠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人课幕,你說我怎么就攤上這事厦坛。” “怎么了乍惊?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵杜秸,是天一觀的道長。 經(jīng)常有香客問我污桦,道長亩歹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任凡橱,我火速辦了婚禮小作,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘稼钩。我一直安慰自己顾稀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布坝撑。 她就那樣靜靜地躺著静秆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巡李。 梳的紋絲不亂的頭發(fā)上抚笔,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機(jī)與錄音侨拦,去河邊找鬼殊橙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狱从,可吹牛的內(nèi)容都是我干的膨蛮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼季研,長吁一口氣:“原來是場噩夢啊……” “哼敞葛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起与涡,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤惹谐,失蹤者是張志新(化名)和其女友劉穎持偏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豺鼻,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡综液,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年款慨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了儒飒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡檩奠,死狀恐怖桩了,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情埠戳,我是刑警寧澤井誉,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站整胃,受9級特大地震影響颗圣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屁使,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一在岂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛮寂,春花似錦蔽午、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至范抓,卻和暖如春骄恶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匕垫。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工僧鲁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人年缎。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓悔捶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親单芜。 傳聞我的和親對象是個(gè)殘疾皇子蜕该,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容