程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++primer(第五版)讀書筆記&習題解答---CHAPTER 3,primer第五版

C++primer(第五版)讀書筆記&習題解答---CHAPTER 3,primer第五版

編輯:C++入門知識

C++primer(第五版)讀書筆記&習題解答---CHAPTER 3,primer第五版


  • C++標准庫類型包括:string,vector和迭代器,其中string是可變長的字符序列,vector存放的是某種給定類型對象的可變長序列,迭代器是string和vector的配套類型,常被用於訪問string中的字符和vector中的元素。

  • 內置類型是C++直接定義的,與硬件密切相關,而標准庫類型是一種高級類型,尚未實現到硬件中。如:相較於標准庫類型string和vector,數組在靈活性上稍顯不足。

3.1 命名空間的using聲明

練習3.1答案
1.9 while循環實現50到100的正數相加
#include<iostream>
using std::cout
using std::endl;
int main()
{
     int sum=0,i=50;
     while(i<=100)
     {
         sum+=i;
         i++;
     }
     cout<<sum<<endl;
     system("pause");
     return 0;
}


1.10 逆序打印10到0之間的整數
#include<iostream>
using std::cout
using std::endl
int main()
{
    int i=10;
    while(i>=0){
        cout<<i<<endl;
        i--;
    }
    system("pause");
    return 0;
}
1.11 鍵入兩整數,打印兩整數間的所有整數
 #include <iostream> 
 using std::cout;
 using std::cin;
 
 void print_range(int lo, int hi)
 {
     if (lo > hi)
         print_range(hi, lo);
     for (int i = lo; i != hi; ++i)
         cout << i << " ";
 }
 
 int main()
 {
    int low = 0, high = 0;
     cout << "please input two integers:\n";
     cin >> low >> high;
     print_range(low, high);
     return 0;
 }
2.41 略

3.2 標准庫類型string

  • string是可變長的字符序列,使用string類型必須首先包含string頭文件,string定義在命名空間std中。
  • string的初始化


    string s1;               // 默認初始化,s1是一個空字符串
    string s2 = s1;          // s2是s1的副本
    string s3 = "hiya";  // s3是該字符串字面值的副本
    string s4(10, ' c ');   // s4的類容是cccccccccc

    string s1     // 默認初始化,s1是一個空串

    string s2(s1)      // s2是s1的副本

    string s2 = s1      // 等價於s2(s1),s2是s1的副本

    string s3("value")     // s3是字面值“value"的副本,除了字面值最後的那個空字符外

    string s3 = "value"     // 等價於s3("value"),s3是字面值”value"的副本

    string s4(n, ' c')    // 把s4初始化為由連續n個字符c組成的串

  • 使用等號初始化實際上是拷貝初始化,編譯器直接把等號右側的初始值拷貝到新的對象上,想反,不含等號的初始化是直接初始化化


    string s5 = "hiya";                 //拷貝初始化
    string s6("hiya");                  //直接初始化
    string s7(10, ' c');                 //直接初始化
  • 用拷貝初始化對多個值進行初始化時,須創建一個臨時對象用於拷貝


    string s8 = string(10, 'c');          //可讀性差
    等價於如下:
    string temp(10, 'c');
    string s8 = temp;
  • 一個類除規定初始化其對象方式外,還需定義在對象上所能執行的操作

  • 有關string對象上的操作如下表:
    os<<s 將s寫到輸出流os當中,返回os is>>s 從is中讀取字符串賦給s,字符串以空白分隔,返回is getline(is, s) 從is中讀取一行賦給s,返回is s.empty() s為空賦返回true,否則返回false s.size() 返回s中的字符的個數 s[n] 返回s中第n個字符的引用,位置n從0計起 s1+s2 返回s1和s2連接後的結果 s1=s2 用s2的副本代替s1中原來的字符 s1==s2 如果s1和s2中所含的字符完全一樣,則它們相等,返回true s1!=s2 如果s1和s2中所含的字符不一樣,返回true <, <=, >, >= 利用字符在字典中的順序進行比較,且對字母的大小寫敏感

  • 讀寫string,輸入cin >> s;執行讀取操作時,string對象會自動忽略開頭的空白(空格符、換行符、制表符等)並從第一個真正的字符開始讀起,直到下一處空白為止。
    輸入 cin >> s1 >> s2 >>……;執行讀取多個輸入

  • 讀取數量未知數量的string對象


    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
             string word;
             while (cin >> word)         // 反復讀取,直到文件末尾(Windows以Crtl+Z表示結束符)
                       cout << word << endl;
             return 0;
    }
  • 使用getline讀取一整行,getlin函數的參數是一個輸入流和一個string對象,函數從給定的輸入流讀入內容,直到換行符(包括換行符)為止,然後將所讀內容拷貝到string的對象中去(此時不包含換行符), getline只要一遇到換行符就結束讀取操作並返回結果,當開始輸入的就是換行符,那麼換回的結果就是個空的string。


    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
             string line;
             while (getline(cin, line))         // 每次讀如一整行,直到文件末尾(Windows以Crtl+Z表示結束符)
                       cout << line << endl;
             return 0;
    }
  • empty是string的一個成員函數,可以使用點操作符調用empty函數
    // 每次讀入一整行,遇到空行直接跳過 #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
    string line;
    while (getline(cin, line)
              if (!line.empty())
              cout << line << endl;
    return 0;
    }
  • 同樣,size也是string的一個成員函數
    //每次讀入一整行,輸出其中超過80個字符的行
    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
    string line;
    while (getline(cin, line)
         if (line.size() > 80)
         cout << line << endl;
    return 0;
    }
  • 在調用size成員函數時,返回的是一個string::size_type類型的值,是一個無符號類型的值且能夠存放任何string對象的大小,所有用於存放string類的size函數返回值的變量,都應是string::size_type類型,在C++11中,通過auto或decltype推斷變量的類型:
    auto len = line.size();    //  len的類型是string::size_type

    注意在表達式中不能混用帶符號數與無符號數(將會產生意想不到的結果),例如n是一個具有負值的int,則表達式s.size()<n的判斷結果幾乎肯定是true(因為負值n會自動轉換成一個比較大的無符號數)
  • 如果在一條表達式中已經有了size()函數就不要在使用int了,可以避免因混用int與unsigned可能帶來的問題
    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved