1. 程式人生 > >清華大學《C++語言程式設計基礎》線上課程筆記05---vector物件,物件的複製與移動,string類

清華大學《C++語言程式設計基礎》線上課程筆記05---vector物件,物件的複製與移動,string類

vector 物件

C++標準庫中的一個類模板

  • 封裝任何型別的動態陣列,自動建立和刪除。
  • 陣列下標越界檢查。
  • 將動態陣列封裝成類的知識點中封裝的ArrayOfPoints也提供了類似功能,但只適用於一種型別的陣列。
 vector<元素型別> 陣列物件名(陣列長度);
 vector<int> arr(5)   //建立大小為5的int陣列

1.與一般陣列不同,vector陣列物件名不表示陣列首地址;
2.可以用size函式獲得vector陣列的長度

unsigned n;
cin>>n;
vector<double> arr(n); 
for (unsigned i = 0; i < n; i++)
    cin >> arr[i];    //下標讀取,因為Vector類中過載了下標運算子

cout << "Average = " << average(arr) << endl;

//計算陣列arr中元素的平均值
double average(const vector<double> &arr)  //常引用
{
double sum = 0;
for (unsigned i = 0; i<arr.size(); i++)  //size函式的使用
sum += arr[i];
return sum / arr.size();
}

基於範圍的 for 迴圈配合 auto 舉例

#include <vector>
#include <iostream>
int main()
{
std::vector<int> v = {1,2,3};
for(auto i = v.begin(); i != v.end(); ++i)  //.begin()和.end()取到迭代器的首尾地址
    std::cout << *i << std::endl;
    
for(auto e : v)  //適用於各種容器
    std::cout << e << std::endl;
}

物件複製與移動

深層複製

  • 當被複制的物件資料成員是指標型別時,不是複製該指標成員本身,而是將指標所指物件進行復制;
  • 需要手寫複製建構函式.
class ArrayOfPoints { //動態陣列類
public:
ArrayOfPoints(int size) : size(size){  //建構函式
points = new Point[size];  //建立動態陣列
}

~ArrayOfPoints() {  //解構函式
delete[] points;
}

private:
Point *points; //指向動態陣列首地址
int size; //陣列大小
}

ArrayOfPoints::ArrayOfPoints(const ArrayOfPoints& v) {
size = v.size;
points = new Point[size];   //重新申請動態分配
for (int i = 0; i < size; i++)
points[i] = v.points[i];             //挨個複製
}

移動構造(C++11)

將即將消亡的源物件(左值)資源的控制權全部交給目標物件,無需重新申請記憶體分配

class_name ( class_name && ) 
注:&&是右值引用,函式返回的臨時變數是右值
class IntNum {
public:

IntNum(int x = 0) : xptr(new int(x)){ //建構函式
cout << "Calling constructor..." << endl;}

IntNum(const IntNum & n) : xptr(new int(*n.xptr)){//複製建構函式
cout << "Calling copy constructor..." << endl;}

IntNum(IntNum && n): xptr( n.xptr){ //移動建構函式
n.xptr = nullptr;
cout << "Calling move constructor..." << endl;}

~IntNum(){ //解構函式
delete xptr;
cout << "Destructing..." << endl;}

private:
int *xptr;
};

//返回值為IntNum類物件
IntNum getNum() {
IntNum a;
return a;}

int main() 
{   cout << getNum().getInt() << endl; return 0;
}

字串

用字元陣列儲存字串(C 風格字串)

char str[8] = { 'p', 'r', 'o', 'g', 'r', 'a', 'm', '\0' };
char str[8] = "program";
char str[] = "program";

string 類

  • 使用字串類string表示字串;
  • string實際上是對字元陣列操作的封裝.
string s1;
string s2 = “abc”;
string s3 = s2; 

常用操作
s + t 將串s和t連線成一個新串
s = t 用t更新s
s == t 判斷s與t是否相等
s != t 判斷s與t是否不等
s < t 判斷s是否小於t(按字典順序比較)
s <= t 判斷s是否小於或等於t (按字典順序比較)
s > t 判斷s是否大於t (按字典順序比較)
s >= t 判斷s是否大於或等於t (按字典順序比較)
s[i] 訪問串中下標為i的字元

例:
string s1 = "abc", s2 = "def";
string s3 = s1 + s2; //結果是"abcdef"
bool s4 = (s1 < s2); //結果是true
char s5 = s2[1]; //結果是'e''

輸入整行字串

" cin>>..."讀取到空格時會停止錄入字串

此時,可以

#include<string>  

使用getline()函式
可以用第三個引數設定字串結束的分隔符

#include <iostream>
#include <string>       //需要包含該標頭檔案
using namespace std;
int main() {
for (int i = 0; i < 2; i++)
{   string city, state;
    getline(cin, city, ',');//第三個引數可以設定字串結束的分隔符
    getline(cin, state);    //預設是換行符結束
    cout << "City:" << city << “ State:" << state << endl;
}
return 0;
}