清華大學《C++語言程式設計基礎》線上課程筆記05---vector物件,物件的複製與移動,string類
阿新 • • 發佈:2018-11-09
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;
}