從這篇博客開始學(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.