最近又倒回去看了看之前學的沒記筆記的知識。
學了string的皮毛以及範圍for。
大部分我們用到的庫函數都屬於命名空間std,所以要了解關於命名空間的using聲明。 我的理解是,舉個例子,假如我們要使用cout與cin,
就算添加了庫文件,不添加using聲明,我們使用cout<<什麼什麼<<endl;這樣編譯器會報錯,因爲我們使用的名字不夠完整,完整的名字爲:
std::cout<<什麼什麼<<std::endl;這樣的話,爲了不這麼繁瑣,我們可以使用using聲明,using std::cout;using std::endl;或者直接把整個std包含
進來,using namespace std; 這裏注意:頭文件不應該包含using聲明。因爲,頭文件是要包含在別的文件去的,別的文件也許會聲明using什麼,
這樣就會弄混。
string十個標準庫類型,其中的學問很大,百度之後,就於拷貝賦值與直接賦值都有學問,因爲我的愚笨,我就先記下一些皮毛的筆記。
<1>string的操作:
os<<s
is<<s 輸入輸出
getline(is,s) 從is中讀取一行給s
s.empty() 判斷s是否爲空字符串
s.size() 返回s的字符串長度,類型爲size_type
s[n] 下標方法,返回一個字符
s1 + s2字符串相加
s1 = s2 字符串賦值
s1 == s2 字符串比較,返回bool
s1 != s2 同上
<, <= , >, >= 利用字符在字典的順序進行比較,對大小寫敏感
<2>size_type
它是一個無符號類型,所有存放string的size函數返回值的變量,都是string::size_type類型,舉個例子:加入n是一個具有負值的int,表達式s.size()<n的判斷,結果幾乎肯定是true,這是因爲負值n會自動地轉換成一個較大的無符號數。所以根據我自己的理解,在應用string或者其他會返回size_type,應該說可能會返回,儘量應用auto與decltype來定義這個類型,例如decltype(s.size()) c=0; 後面的筆記還會有例子。
<3>string相加
注意一個就是:C++中大部分的運算方式都是從左邊到右邊,string相加必須確保每個加法運算的兩側的運算至少要一個是string類型。例如:
string s4 =s1+","; 正確
string s5 = "hello" + "world"; 錯誤
string s6 = s1 + "," + "world"; 這裏就是上面提到的,從左向右,可以堪稱(s1+",")+"world";括號裏相加還是string類型
string s7 = “hello" + "," +s1; 錯誤,道理如上
<4>string字符處理:
isalnum(c) 當c是字母或者數字的時候爲真
isalpha(c) 當c是字母時候爲真
iscntrl(c) 當c爲控制字符時爲真
isdigit(c) 當c爲數字的時候爲真
isgraph(c) 當c不是空格但是可以打印的時候爲真
islower(c) 當c爲小寫的時候爲真
isprint(c) 當c可以打印時候爲真
ispunct(c) 當c爲符號時候爲真
isspace(c) 當c爲空格時候爲真
isupper(c) 當c爲大寫的時候爲真
isxdigit(c) 當c爲十六位進制數字時候爲真
tolower(c) 當c爲大寫時候輸出小寫,當c爲小寫,輸出本身。
toupper(c) 當c爲小寫時候輸出大寫,當c爲大寫輸出本身。
例子:當輸入abCD我要輸出都爲小寫。這裏可以while以及for配合下標或者迭代器,或者範圍for,第五點就是範圍for的概念。
<5>範圍for
語法:for (declaration:expression){........}
declaration爲一個變量,遍歷expression中的每個元素。舉個例子:
string s1 = "word";
for ( const auto c : s1)
{
cout<<c<<endl;
}得到結果就是
w
o
r
d
這就是範圍for,《Effective C++》書裏說盡量使用const,那麼當我們要通過範圍for來修改s1中的東西時候,應該使用引用。
string s2 = "world";
for ( auto &c : s2)
{
c=X;
}
結果會等於:
XXXXX