引:
標准庫類型是語言組成部分中更基本的哪些數據類型(如:數組、指針)的抽象!
C++標准庫定義的是高級的抽象數據類型:
1、高級:因為其中反映了更復雜的概念;
2、抽象:因為我們在使用時不需要關心他們是如何表示的,我們只需要知道這些抽象數據類型支持哪些操作就可以了。
正文:
1、 using std::cin;
::運算符的作用含義是右操作數的名字可以在左操作數的作用域中找到。
格式:
using namespace::name;
//一旦使用了using聲明,我們就可以直接引用名字,而不需要再引用該名字的命名空間!
示例:
#includeusing std::cin; using std::cout; using std::endl; int main() { cout << "Enter two numbers:" << endl; int v1, v2; cin >> v1 >> v2; cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 << endl; return 0; }
2、在一種情況下,必須總是使用完全限定的標准庫名字:在頭文件中。
通常,頭文件中應該只定義確實必要的東西。請養成這個好習慣!
string類型支持長度可變的字符串,C++標准庫將負責管理與存儲字符相關的內存,以及提供各種有用的操作。
#includeusing std::string;
1、string對象的定義和初始化
//四種定義及初始化方式 string s1; string s2(s1); string s3("value"); string s4(n,'c');
2、string與字符串字面值的異同
1)都是以'\0'結尾
string s1("value"); for (string::size_type i = 0;s1[i] != '\0'; ++i) cout << s1[i] << ' '; cout << endl;
2)字符串字面值與string根本就不是一個類型!
string SI = "ABC"; char SII[] = "CDE"; string tmp = SI; SI = string(SII); strcpy(SII,tmp.c_str()); cout << SI << endl; cout << SII << endl;
3、getline讀取整行文本
1)、getline函數從輸入流的下一行讀取,並保存讀取內容到string中,但是不包括換行符!
2)、getline函數將stream參數作為返回值!
3)、由於getline在返回時丟棄換行符,所以換行符將不會保存在string對象中!
//P72 習題3.5 int main() { string line; while (getline(cin,line)) { cout << line << endl; } return 0; }
//3.5(2) int main() { string word; while (cin >> word) { cout << word << endl; } return 0; }
4、string對象的操作 size與empty
//例程1 string st("The expense of spirit\n"); cout << "The size of " << st << "is " << st.size() << " characters, including the newline" << endl;
//例程2 string se; if (se.empty()) { cout << "The string is empty!" << endl; } else { cout << "The size of " << se << "is " << se.size() << " characters, including the newline" << endl; }
5、string::size_type類型
string類類型和許多其他庫類型都定義了一些配套類型,通過這些配套類型,庫類型的使用就能與機器無關(machine-independent)。string::size_type類型可以保證足夠大到能夠存儲任意string對象的長度。
string str = "Hello World"; string::size_type length = str.size();
6、string關系操作符
==,!=,<,<=,>=,>
string big = "big",small = "small"; if (big == small) //big <= small,big >= small,big != small,... { //... } else { //... }
7、string對象的賦值
string s1,s2 = “value”; s1 = s2;
賦值操作需要做一些操作:它必須把s1占用的相關內存釋放掉,然後再分配給s1足夠存放s2副本的內存空間,最後把s2中所有的字符都復制到新分配的內存中!
8、兩個string對象相加
string s1("hello, "); string s2("world\n"); string s3 = s1 + s2; cout << s3 << endl; string s4 = s2 + s1; cout << s4 << endl; string s5 = s3 + "! " + "I`m a programmer!"; cout << s5 << endl;
9、string對象str下標的取值范圍:0~str.size()-1
string str ("Some thing!"); for (string::size_type i = 0; i != str.size(); ++i) { cout << str[i]; } cout << endl;
10、string對象下標可以用作左值
string str ("Some thing!"); for (string::size_type i = 0; i != str.size(); ++i) { str[i] = '*'; } cout << str << endl;
11、string對象中的字符處理函數
isalnum,isalpha,iscntrl,isdigit,isgraph,islower,isprint,ispunct,isspace,isupper,isxdigit,tolower,toupper...
//P78 習題3.7 //(1) int main() { string s1,s2; cin >> s1 >> s2; if (s1 > s2) { cout << s1 << " is bigger!" << endl; } else if (s1 < s2) { cout << s2 << " is bigger!" << endl; } else { cout << s1 << " is equal to " << s2 << endl; } return 0; }
//(2) int main() { string s1,s2; cin >> s1 >> s2; if (s1.size() > s2.size()) { cout << s1 << " is longer!" << endl; } else if (s1.size() < s2.size()) { cout << s2 << " is longer!" << endl; } else if (s1.empty() && s2.empty()) { cout << s1 << " and " << s2 << " is empty!" << endl; } else { cout << s1 << " is equal to " << s2 << endl; } return 0; }
//習題 3.8 //(1) int main() { string sub,str; while (cin >> sub) { str += sub; } cout << str << endl; return 0; }
//(2) int main() { string sub,str; cin >> sub; str = sub; while (cin >> sub) { str += ' '; str += sub; } cout << str << endl; return 0; }
//習題 3.9 下面的程序是否合法,合法的話會輸出什麼值? int main() { string s; cout << s[0] << endl; s[1] = '*'; cout << s[1] << endl; return 0; }