原创 移動構造和移動賦值運算符

定義 只是自動幫你調用析構。得自己確保寫對這個函數。比如把指針指向清0,讓移後源對象達到一個安全的可析構狀態。 strVec::strVec(strVec &&) noexcept:elements(s.elements), first

原创 拷貝、賦值和析構函數

拷貝構造函數 基本形式 注意形參類型是類類型,不能聲明爲explicit,因爲有些地方需要隱式轉換 class Foo { public: Foo(); Foo(const Foo&); }; 合成拷貝構造函數 你不聲明

原创 動態數組

構建方式 1.原始的new,delete方式 2.標準庫的allocator類 最好使用標準庫,簡單而且不易出現內存管理錯誤 new方式 1.[]裏不用填常量,只要是整數就行 int *p= new int[get_size()]; 2

原创 智能指針

動機 幫助程序員自動釋放申請的動態內存。智能指針也是模板類 shared_ptr make_shared函數 一般通過次函數創建指向的對象,該函數還返回一個智能指針。注意參數一定要和該類型的某個構造函數一致。 這樣定義的話我感覺以後可以告

原创 c++內存分類

靜態內存 存放局部static對象,類裏的static成員,任何函數外定義的變量 棧內存 局部非static對象 堆內存 程序員手動分配的內存,發生內存泄露的根源地 文字常量區 const屬性,不可改  

原创 關聯容器

分類 (1)按map和set分;(2)按是否重複出現分;(3)按是否無序分。 定義 支持列表初始化 map <string,size_t> word_count = {{"0",0}}; set<int> exclude = {0,

原创 三種不一般的迭代器(插入迭代器,iostream迭代器和反向迭代器)

插入迭代器,iostream迭代器和反向迭代器都是迭代器的補充,是一種迭代器適配器,是一種泛型算法,不屬於特定容器。 插入迭代器 back_interter 調用容器的push_back() front_interter 調用容器的pus

原创 5類迭代器

分類 啥叫單遍掃描和多遍掃描? 推測多遍掃描就是可以再建些迭代器的副本,來掃描,不影響本身。 輸入迭代器 只讀不能寫,所以*iter 只能出現在=右邊。咋保證呢?不能保存迭代器狀態,只能單遍掃描。 一個有意思的事 問: *it++會導致

原创 bind解救普通函數

動機 老是用lambda表達式,也不行呀,得讓普通函數也能適應一下標準庫算法。 形式 auto newCallable = bind(callable, arg_list); //arg_list是給callable的參數 用法 普通函

原创 泛型算法

動機 容器定義了自己的成員函數,但是很多操作都是通用的,可以通過一套算法。用於不同類型的容器,多好。 #include<algorithm> #include<numeric> //一些數值泛型 算法本質通過迭代器訪問元素 1.算法執行

原创 順序容器概述

分類 有vector,deque,list,forward_list,array,string。 1. 容器構造函數有一個版本只接受一個容器大小參數,其採用的是類型的默認構造函數。如果沒有默認構造函數,就得傳遞一個元素初始化器。 vec

原创 順序容器

何時迭代器失效 如果向容器的插入和刪除造成元素移動,迭代器就會失效;如果引起內存重新分配,那麼就會全部失效。 emplace_back和push_back push_back調用的是拷貝構造函數,而emplace_back調用的是構造函數

原创 IO類

IO類型 rea ifstream和istringstream 繼承自istream;ofstream和ostringstream繼承自ostream。 IO對象無法拷貝和賦值 估計這裏是禁用了拷貝和賦值函數,不能拷貝的連帶作用是不能作爲

原创 static成員

類定義  class Account{ public: static double rate(){ return interestRate; } private: static double i

原创 explicit限制單參數構造函數的類型轉換

 動機 只有一個參數的構造函數存在隱式類型轉換的可能。比如如下構造函數: struct Sales_data{ Sales_data() = default; Sales_data(const string& s):bo