-? <span class="timestamp-wrapper"><span class="timestamp">[2020-01-10 五 11:53] </span></span> 第9章 順序容器
? ?
? ? ? ? vector,隨機(jī)訪問、大小可變、尾部之外插入刪除慢、額外空間開銷小
? ? ? ? deque, 隨機(jī)訪問、大小可變、頭尾之外插入刪除慢、額外空間開銷小
? ? ? ? list, 順序雙向訪問、大小可變、插入很快、額外空間開銷大
? ? ? ? forward_list,順序單向訪問、大小可變、插入很快、額外空間開銷大
? ? ? ? array, 隨機(jī)訪問、固定大小、不能增刪、額外空間開銷小
? ? ? ? string, 類似vector、專為字符、額外空間開銷小
-? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-12 日 10:56> </span></span> 9.2 容器庫概覽
? ?
? ? ? ? 描述容器接口的思路:
? ? ? ? 1、所有容器通用接口
? ? ? ? 2、順序與非順序容器的特定接口
? ? ? ? 3、其它特殊容器特殊接口(如string)
? ? ? ?
? ? ? ? 類型別名
? ? ? ? iterator
? ? ? ? const_iterator
? ? ? ? size_type
? ? ? ?
? ? ? ? difference_type
? ? ? ? value_type
? ? ? ? reference
? ? ? ? const_reference
? ? ? ?
? ? ? ? 構(gòu)造函數(shù)
? ? ? ? C c;
? ? ? ? C c1(c2);
? ? ? ? C c(b,e);
? ? ? ? C c{a,b,c...};
? ? ? ?
? ? ? ? 賦值與swap
? ? ? ? c1=c2;
? ? ? ? c1={a,b,c...};
? ? ? ? a.swap(b);
? ? ? ? swap(a,b);
? ? ? ?
? ? ? ? 大小
? ? ? ? c.size();
? ? ? ? c.max_size();
? ? ? ? c.empty();
? ? ? ?
? ? ? ? 增刪(不適用于array)
? ? ? ? c.insert(args);
? ? ? ? c.emplace(inits);
? ? ? ? c.erase(args)
? ? ? ? c.clear();
? ? ? ?
? ? ? ? 關(guān)系
? ? ? ? ==,!=,<,<=,>,>=
? ? ? ?
? ? ? ? 迭代器
? ? ? ? c.begin(),c.end();
? ? ? ? c.cbegin(),c.cend();
? ? ? ?
? ? ? ? 反向額外成員
? ? ? ? reverse_iterator
? ? ? ? const_reverse_iterator
? ? ? ? c.rbegin(),c.rend():
? ? ? ? c.crbegin(),c.crend();
? ?
? ? ? ? vector<NoDefault> v1(10,init)//對于一個沒有默認(rèn)構(gòu)造函數(shù)的類型NoDefault通過元素初始化器。
? ? ? ?
? ? ? ? 容器是模板類,容器元素可以任何甚至可以是另外一個容器類,但是舊版編譯器需要在兩個尖括號之間加入空格,例如:
? ? ? ? vector<vector<string> >;
? ?
? ? ? ? 兩個迭代器構(gòu)成的迭代器范圍是左閉右開的,即:[begin,end), end可以與begin是同一個位置(范圍為空),但是不能在begin之前。
? ? ? ? 兩個迭代器可以指向同一個容器中的元素或者最后一個元素之后的位置。
? ?
? ? ? ? 迭代器函數(shù)
? ? ? ? begin/end這類返回迭代器的函數(shù)是被重載的,如果對象是普通變量,返回的是正常的iterator,如果是常量返回的則是const_iterator。
? ? ? ? 以c開頭的函數(shù)是C++新引入的,以支持auto,與begin/end一起使用。
? ? ? ?
? ? ? ? 帶r版本的迭代器是反向的。
-? <span class="timestamp-wrapper"><span class="timestamp">[2019-11-30 六 13:35] </span></span> 將一個容器初始化為另一個容器的拷貝
? ?
? ? 容器定義和初始化
? ?
? ? ? ? //默認(rèn)構(gòu)造函數(shù)
? ? ? ? C c;
? ? ? ?
? ? ? ? //用一個容器創(chuàng)建另一個做為它的拷貝的容器,必須兩個容器的類型、以及容器元素類型都一樣,array的大小還必須一樣。
? ? ? ? C c1(c2);
? ? ? ? C c1=c2;
? ? ? ?
? ? ? ? //c初始化為初始化列表元素的拷貝,列表元素與容器元素類型必須相同;array時,列表必須不能超過array大小
? ? ? ? C c{a,b,c...};
? ? ? ? C c={a,b,c...};
? ? ? ?
? ? ? ? //初始化為范圍中的元素,范圍中元素類型必須與C中元素類型相同(不能是array)
? ? ? ? C c(b,e);
? ? ? ?
? ? ? ? //只適合順序容器
? ? ? ? C seq(n);//n個元素進(jìn)行值初始化,構(gòu)造函數(shù)是explicit的(即阻止自動隱式轉(zhuǎn)換)(不能是string)
? ? ? ? C seq(n,t);//n個元素,初始化為值t
? ?
? ? ? ? 用一個容器創(chuàng)建另一個做為它的拷貝的容器,必須兩個容器的類型、以及容器元素類型都一樣,array的大小還必須一樣。
? ? ? ? list<string> list2(authors);
? ? ? ?
? ? ? ? 用迭代器范圍來初始化容器類型和容器元素的類型都可以不同,因為直接替換了容器原來的元素。
? ? ? ? deque<string> authList(authors.begin(),it);//包括[begin(),it)迭代器范圍
? ? ? ?
? ? ? ? 用列表初始化,列表隱含了被初始化容器的大小。
? ? ? ? list<string> authors = {"one", "two", "three"};
? ? ? ? 除array外,初始化列表賦值之后,元素大小變?yōu)槌跏蓟斜泶笮。〝?shù)組則要求初始化列表大小小于數(shù)組)。
? ? ? ?
? ? ? ? 順序容器相關(guān),如果沒有默認(rèn)構(gòu)造函數(shù),必須用兩個參數(shù)的,第二個參數(shù)提供默認(rèn)值;如果有默認(rèn)構(gòu)造函數(shù),則只需要傳遞元素數(shù)目也行。
? ? ? ? vector<int> ivec(10,-1);//10個元素,每個值-1
? ? ? ? forward<int> ivec(10);//10個元素,每個值0
? ? ? ?
? ? ? ? 注:上面的例子中,authors是list。
-? 9.2.5 賦值和swap
? ?
? ? ? ? c1=c2;
? ? ? ? c={a,b,c...};
? ? ? ? swap(c1,c2);
? ? ? ? c1.swap(c2);
? ? ? ?
? ? ? ? seq.assign(b,e);
? ? ? ? seq.assign(il);
? ? ? ? seq.assign(n,t);
? ?
? ? ? ? 大小是array類型的一個部分:
? ? ? ? array<int,10> size_type i;
? ? ? ? 所以array構(gòu)造函數(shù)是不應(yīng)當(dāng)有大小參數(shù)的。
? ? ? ?
? ? ? ? 與內(nèi)置數(shù)組不同,array可以賦值和初始化,不過使用其它數(shù)組賦值的時候,要求數(shù)組類型匹配(大小、元素類型)
? ? ? ? array<int,10> ia2={0,1,2,3,4,5,6,7,8,9};
? ? ? ? array<int,10> ia3={42};
? ? ? ?
? ? ? ? array<int,10> ia4=ia3;
? ? ? ? 如果列表初始化,則列表大小需要小于數(shù)組,并且剩余的元素要有相應(yīng)的默認(rèn)構(gòu)造函數(shù)來進(jìn)行默認(rèn)初始化。
? ? ? ? 注:花括號初始化列表只能初始化賦值,不能初始化之后,再用花括號對數(shù)組進(jìn)行賦值。非數(shù)組可以用花括號賦值。
? ?
? ? ? ? assign只用于除了array之外的順序容器。允許從不同但相容類型賦值
? ? ? ? 由于是舊元素被替換,傳遞給assign的迭代器不能指向調(diào)用assign的容器。
? ?
? ? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-13 一 13:21> </span></span> 使用swap
? ?
? ? ? ? 除array之外,swap不會導(dǎo)致元素拷貝、刪除、插入。swap后,string的迭代器會失效,數(shù)組的迭代器會指向原來的位置(但是元素已經(jīng)被置換了),而其它的迭代器也會被置換(各自仍指向原來被換的元素)。
? ?
? ? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-14 二 10:59> </span></span> 比較
? ?
? ? ? ? 容器比較必須保證元素類型和容器類型是相同的,并且只有元素也定義了比較運(yùn)算才能使用運(yùn)算符號對容器進(jìn)行比較。
? ?
? ? -? 9.3 容器操作
? ? ? ? 插入相關(guān)
? ? ? ?
? ? ? ? ? ? //尾部追加,forwardlist不支持
? ? ? ? ? ? c.push_back(t);//值為t的元素
? ? ? ? ? ? c.emplace_back(args);//args創(chuàng)建的元素
? ? ? ? ? ?
? ? ? ? ? ? //頭部創(chuàng)建,vector與string不支持
? ? ? ? ? ? c.push_front(t);
? ? ? ? ? ? c.emplace_front(args);
? ? ? ? ? ?
? ? ? ? ? ? //指定位置之前的插入,forwardlist不支持下面的而是有自己專用的insert和emplace
? ? ? ? ? ? c.insert(p,t);//在p迭代器對應(yīng)元素之前插入值為t的元素
? ? ? ? ? ? c.emplace(p,args);
? ? ? ? ? ? c.insert(p,n,t);//n個值為t的元素
? ? ? ? ? ? c.insert(p,b,e);//迭代器范圍[b,e)
? ? ? ? ? ? c.insert(p,il);//花括號元素列表il
? ? ? ?
? ? ? ? ? ? 對象插入或初始化容器后,容器中的對應(yīng)元素與對象并無關(guān)系,對象只是拷貝,類似傳值調(diào)用。
? ? ? ?
? ? ? ? ? ? emplace直接在容器管理的空間中創(chuàng)建對象而不拷貝對象,emplace參數(shù)必須與元素類型構(gòu)造函數(shù)參數(shù)匹配,
? ? ? ?
? ? ? ? 訪問相關(guān)
? ? ? ?
? ? ? ? ? ? 訪問成員函數(shù)返回的是引用
? ? ? ? ? ? front()是首元素(begin()),back是尾元素(end()-1),forwardlist不支持back();
? ? ? ? ? ? c.front(),c.back();
? ? ? ? ? ?
? ? ? ? ? ? 下標(biāo)操作和at()可以隨機(jī)訪問,下標(biāo)需要程序員自己注意越界情況,而at()會在越界的時候自動拋出相關(guān)的out_of_range錯誤
? ? ? ? ? ? c[n],c.at(n);
? ? ? ?
? ? ? ? 刪除相關(guān)
? ? ? ?
? ? ? ? ? ? //forwardlist不支持erase,它有自己專用的刪除函數(shù)
? ? ? ? ? ? //下面操作改變?nèi)萜鞔笮∷圆恢С謅rray
? ? ? ? ? ? c.pop_back();//刪除尾元素,forwardlist不支持
? ? ? ? ? ? c.pop_front();//刪除首元素,vector和string不支持
? ? ? ? ? ?
? ? ? ? ? ? c.erase(p);//刪除p所指向的元素(p是迭代器)
? ? ? ? ? ? c.erase(b,e);//刪除[b,e)范圍內(nèi)的元素
? ? ? ? ? ? c.clear();//刪除所有元素
? ? ? ?
? ? ? ? forwardlist特殊的函數(shù)
? ? ? ?
? ? ? ? ? ? //特殊的迭代器
? ? ? ? ? ? lst.before_begin();//首元素之前不存在的元素迭代器
? ? ? ? ? ? lst.cbefore_begin();
? ? ? ? ? ?
? ? ? ? ? ? //特殊的插入
? ? ? ? ? ? lst.insert_after(p,t);
? ? ? ? ? ? lst.insert_after(p,n,t);
? ? ? ? ? ? lst.insert_after(p,b,e);
? ? ? ? ? ? lst.insert_after(p,il);
? ? ? ? ? ?
? ? ? ? ? ? emplace_after(p,args);
? ? ? ? ? ?
? ? ? ? ? ? //特殊的刪除
? ? ? ? ? ? lst.erase_after(p);
? ? ? ? ? ? lst.erase_after(b,e);
? ?
? ? -? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-14 二 11:50> </span></span> 9.3.5改變?nèi)萜鞔笮?
? ? ? ?
? ? ? ? ? ? c.resize(n);
? ? ? ? ? ? c.resize(n,t);
? ?
? ? -? 9.3.6 容器操作可能會使迭代器失效
? ? ? ?
? ? ? ? ? ? 插入、刪除都可能導(dǎo)致容器迭代器失效,不同容器情況不同(比如vector、list等)具體參考相關(guān)位置。
? ? ? ? ? ?
? ? ? ? ? ? 大致情況如下:
? ? ? ? ? ? 對于插入,
? ? ? ? ? ? 指向list/forwardlist的引用、指針、迭代器都不會失效;
? ? ? ? ? ? vector/string若重新分配則指針、引用、迭代器全失效,若未重新分配則插入之前的引用、指針、迭代器不會失效;
? ? ? ? ? ? deque插入首尾之外則指針、引用、迭代器全失效,插入首尾則迭代器失效但是指向存在的指針、引用不會失效。
? ? ? ? ? ?
? ? ? ? ? ? 對于刪除,
? ? ? ? ? ? 指向被刪元素的迭代器、指針、引用全都失效;
? ? ? ? ? ? 指向list/forwardlist其它位置的引用、指針、迭代器都不會失效;
? ? ? ? ? ? deque刪除首尾之外則其它元素指針、引用、迭代器全失效,刪除尾部則尾后迭代器失效其它不失效,刪除首部則其它都不會被影響。
? ? ? ? ? ? 指向vector/string被刪除元素之前的指針、引用、迭代器都有效。
? ? ? ? ? ? 只要刪除元素,尾后迭代器都失效。
? ? ? ?
? ? ? ? ? ? 對于vector/string/deque,為防止失效,循環(huán)中操作容器后需要更新迭代器、引用、指針。
? ? ? ? ? ? insert()/erase()均會返回新迭代器,用它更新迭代器即可。
? ? ? ? ? ? 類似如下這樣進(jìn)行:
? ? ? ? ? ? inter= vi.insert(...);
? ? ? ? ? ? inter= vi.erase(....);
? ? ? ? ? ?
? ? ? ? ? ? 不要在循環(huán)外保存c.end()返回的尾迭代器做為判斷,而直接每次使用新的返回值
? ? ? ? ? ? 類似如下這樣進(jìn)行:
? ? ? ? ? ? while(begin != v.end())
? ? ? ? ? ? {...}
? ?
? ? -? 9.4 vector對象是如何增長的
? ? ? ?
? ? ? ? ? ? vector元素連續(xù),增加元素會導(dǎo)致重新分配空間,移動所有元素,所以通過一定策略預(yù)先給它分配多余的預(yù)留空間,防止頻繁移動所有元素。
? ? ? ? ? ? capacity()告訴我們不重新分配內(nèi)存(擴(kuò)張)的情況下可以容納多少個元素;reserve告訴我們它應(yīng)當(dāng)預(yù)留準(zhǔn)備保存的元素數(shù)目。
? ? ? ? ? ? c.shrink_to_fit();//將capacity減少到與size(即實際的元素數(shù))同樣大小。
? ? ? ? ? ? c.capacity();//最大能保存的元素數(shù)目,超過則重新分配內(nèi)存。
? ? ? ? ? ? c.reserve(n);//預(yù)留n的空間,不改變?nèi)萜髟財?shù)量,僅影響vector預(yù)先分配多大的空間。
? ? ? ? ? ?
? ? ? ? ? ? 當(dāng)需求大于當(dāng)前容量,reserve才會改變vector容量,至少會分配與需求一樣大的空間;當(dāng)需求小于等于當(dāng)前容量,reservse什么都不做并且小于時也并不會退回多余的空間。當(dāng)調(diào)用reserve之后,capacity空間大小會大于等于傳給reserve的參數(shù)。
? ? ? ? ? ?
? ? ? ? ? ? 總之,reserve不會減少容器占用的空間。類似地,resize只減少容器元素數(shù)目而不是容器容量,也不能用它減少預(yù)留空間。
? ? ? ? ? ?
? ? ? ? ? ? shrink_to_fit()會要求退回多余空間,但是實際也不保證一定退回。
? ? ? ?
? ? ? ? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-19 日 12:15> </span></span> capacity和size
? ?
? ? -? <span class="timestamp-wrapper"><span class="timestamp">[2020-03-17 二 11:48] </span></span> 9.5額外的string操作
? ? ? ?
? ? ? ? ? ? 創(chuàng)建函數(shù):使用const char*創(chuàng)建string對象時,如果未指定創(chuàng)建的大小或者指定的大小大于const char*字符數(shù)目,那么const char*必須以NULL空字符結(jié)束,否則不用。
? ? ? ? ? ? string(s), string(s,pos), string(s,pos,n)
? ? ? ? ? ? substr(pos), substr(pos,n)
? ? ? ? ? ?
? ? ? ? ? ? 修改字符串的操作:insert(),erase(),assign(),append(),replace()
? ? ? ? ? ?
? ? ? ? ? ? 搜索函數(shù):返回string:size_typ類型,是下標(biāo),沒有匹配則返回最大值npos的static成員。
? ? ? ? ? ? find(),rfind(),find_first_of(),find_last_of(),find_first_not_of(),find_last_not_of()
? ? ? ? ? ?
? ? ? ? ? ? 比較函數(shù): compare()
? ? ? ? ? ?
? ? ? ? ? ? 數(shù)值轉(zhuǎn)換:to_string(val),stoi(),stol(),stoul(),stoll(),stoull(),stof(),stod(),stold()-? <span class="timestamp-wrapper"><span class="timestamp">[2020-01-10 五 11:53] </span></span> 第9章 順序容器
? ?
? ? ? ? vector,隨機(jī)訪問、大小可變、尾部之外插入刪除慢、額外空間開銷小
? ? ? ? deque, 隨機(jī)訪問、大小可變、頭尾之外插入刪除慢、額外空間開銷小
? ? ? ? list, 順序雙向訪問、大小可變、插入很快、額外空間開銷大
? ? ? ? forward_list,順序單向訪問、大小可變、插入很快、額外空間開銷大
? ? ? ? array, 隨機(jī)訪問、固定大小、不能增刪、額外空間開銷小
? ? ? ? string, 類似vector、專為字符、額外空間開銷小
-? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-12 日 10:56> </span></span> 9.2 容器庫概覽
? ?
? ? ? ? 描述容器接口的思路:
? ? ? ? 1、所有容器通用接口
? ? ? ? 2、順序與非順序容器的特定接口
? ? ? ? 3、其它特殊容器特殊接口(如string)
? ? ? ?
? ? ? ? 類型別名
? ? ? ? iterator
? ? ? ? const_iterator
? ? ? ? size_type
? ? ? ?
? ? ? ? difference_type
? ? ? ? value_type
? ? ? ? reference
? ? ? ? const_reference
? ? ? ?
? ? ? ? 構(gòu)造函數(shù)
? ? ? ? C c;
? ? ? ? C c1(c2);
? ? ? ? C c(b,e);
? ? ? ? C c{a,b,c...};
? ? ? ?
? ? ? ? 賦值與swap
? ? ? ? c1=c2;
? ? ? ? c1={a,b,c...};
? ? ? ? a.swap(b);
? ? ? ? swap(a,b);
? ? ? ?
? ? ? ? 大小
? ? ? ? c.size();
? ? ? ? c.max_size();
? ? ? ? c.empty();
? ? ? ?
? ? ? ? 增刪(不適用于array)
? ? ? ? c.insert(args);
? ? ? ? c.emplace(inits);
? ? ? ? c.erase(args)
? ? ? ? c.clear();
? ? ? ?
? ? ? ? 關(guān)系
? ? ? ? ==,!=,<,<=,>,>=
? ? ? ?
? ? ? ? 迭代器
? ? ? ? c.begin(),c.end();
? ? ? ? c.cbegin(),c.cend();
? ? ? ?
? ? ? ? 反向額外成員
? ? ? ? reverse_iterator
? ? ? ? const_reverse_iterator
? ? ? ? c.rbegin(),c.rend():
? ? ? ? c.crbegin(),c.crend();
? ?
? ? ? ? vector<NoDefault> v1(10,init)//對于一個沒有默認(rèn)構(gòu)造函數(shù)的類型NoDefault通過元素初始化器。
? ? ? ?
? ? ? ? 容器是模板類,容器元素可以任何甚至可以是另外一個容器類,但是舊版編譯器需要在兩個尖括號之間加入空格,例如:
? ? ? ? vector<vector<string> >;
? ?
? ? ? ? 兩個迭代器構(gòu)成的迭代器范圍是左閉右開的,即:[begin,end), end可以與begin是同一個位置(范圍為空),但是不能在begin之前。
? ? ? ? 兩個迭代器可以指向同一個容器中的元素或者最后一個元素之后的位置。
? ?
? ? ? ? 迭代器函數(shù)
? ? ? ? begin/end這類返回迭代器的函數(shù)是被重載的,如果對象是普通變量,返回的是正常的iterator,如果是常量返回的則是const_iterator。
? ? ? ? 以c開頭的函數(shù)是C++新引入的,以支持auto,與begin/end一起使用。
? ? ? ?
? ? ? ? 帶r版本的迭代器是反向的。
-? <span class="timestamp-wrapper"><span class="timestamp">[2019-11-30 六 13:35] </span></span> 將一個容器初始化為另一個容器的拷貝
? ?
? ? 容器定義和初始化
? ?
? ? ? ? //默認(rèn)構(gòu)造函數(shù)
? ? ? ? C c;
? ? ? ?
? ? ? ? //用一個容器創(chuàng)建另一個做為它的拷貝的容器,必須兩個容器的類型、以及容器元素類型都一樣,array的大小還必須一樣。
? ? ? ? C c1(c2);
? ? ? ? C c1=c2;
? ? ? ?
? ? ? ? //c初始化為初始化列表元素的拷貝,列表元素與容器元素類型必須相同;array時,列表必須不能超過array大小
? ? ? ? C c{a,b,c...};
? ? ? ? C c={a,b,c...};
? ? ? ?
? ? ? ? //初始化為范圍中的元素,范圍中元素類型必須與C中元素類型相同(不能是array)
? ? ? ? C c(b,e);
? ? ? ?
? ? ? ? //只適合順序容器
? ? ? ? C seq(n);//n個元素進(jìn)行值初始化,構(gòu)造函數(shù)是explicit的(即阻止自動隱式轉(zhuǎn)換)(不能是string)
? ? ? ? C seq(n,t);//n個元素,初始化為值t
? ?
? ? ? ? 用一個容器創(chuàng)建另一個做為它的拷貝的容器,必須兩個容器的類型、以及容器元素類型都一樣,array的大小還必須一樣。
? ? ? ? list<string> list2(authors);
? ? ? ?
? ? ? ? 用迭代器范圍來初始化容器類型和容器元素的類型都可以不同,因為直接替換了容器原來的元素。
? ? ? ? deque<string> authList(authors.begin(),it);//包括[begin(),it)迭代器范圍
? ? ? ?
? ? ? ? 用列表初始化,列表隱含了被初始化容器的大小。
? ? ? ? list<string> authors = {"one", "two", "three"};
? ? ? ? 除array外,初始化列表賦值之后,元素大小變?yōu)槌跏蓟斜泶笮。〝?shù)組則要求初始化列表大小小于數(shù)組)。
? ? ? ?
? ? ? ? 順序容器相關(guān),如果沒有默認(rèn)構(gòu)造函數(shù),必須用兩個參數(shù)的,第二個參數(shù)提供默認(rèn)值;如果有默認(rèn)構(gòu)造函數(shù),則只需要傳遞元素數(shù)目也行。
? ? ? ? vector<int> ivec(10,-1);//10個元素,每個值-1
? ? ? ? forward<int> ivec(10);//10個元素,每個值0
? ? ? ?
? ? ? ? 注:上面的例子中,authors是list。
-? 9.2.5 賦值和swap
? ?
? ? ? ? c1=c2;
? ? ? ? c={a,b,c...};
? ? ? ? swap(c1,c2);
? ? ? ? c1.swap(c2);
? ? ? ?
? ? ? ? seq.assign(b,e);
? ? ? ? seq.assign(il);
? ? ? ? seq.assign(n,t);
? ?
? ? ? ? 大小是array類型的一個部分:
? ? ? ? array<int,10> size_type i;
? ? ? ? 所以array構(gòu)造函數(shù)是不應(yīng)當(dāng)有大小參數(shù)的。
? ? ? ?
? ? ? ? 與內(nèi)置數(shù)組不同,array可以賦值和初始化,不過使用其它數(shù)組賦值的時候,要求數(shù)組類型匹配(大小、元素類型)
? ? ? ? array<int,10> ia2={0,1,2,3,4,5,6,7,8,9};
? ? ? ? array<int,10> ia3={42};
? ? ? ?
? ? ? ? array<int,10> ia4=ia3;
? ? ? ? 如果列表初始化,則列表大小需要小于數(shù)組,并且剩余的元素要有相應(yīng)的默認(rèn)構(gòu)造函數(shù)來進(jìn)行默認(rèn)初始化。
? ? ? ? 注:花括號初始化列表只能初始化賦值,不能初始化之后,再用花括號對數(shù)組進(jìn)行賦值。非數(shù)組可以用花括號賦值。
? ?
? ? ? ? assign只用于除了array之外的順序容器。允許從不同但相容類型賦值
? ? ? ? 由于是舊元素被替換,傳遞給assign的迭代器不能指向調(diào)用assign的容器。
? ?
? ? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-13 一 13:21> </span></span> 使用swap
? ?
? ? ? ? 除array之外,swap不會導(dǎo)致元素拷貝、刪除、插入。swap后,string的迭代器會失效,數(shù)組的迭代器會指向原來的位置(但是元素已經(jīng)被置換了),而其它的迭代器也會被置換(各自仍指向原來被換的元素)。
? ?
? ? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-14 二 10:59> </span></span> 比較
? ?
? ? ? ? 容器比較必須保證元素類型和容器類型是相同的,并且只有元素也定義了比較運(yùn)算才能使用運(yùn)算符號對容器進(jìn)行比較。
? ?
? ? -? 9.3 容器操作
? ? ? ? 插入相關(guān)
? ? ? ?
? ? ? ? ? ? //尾部追加,forwardlist不支持
? ? ? ? ? ? c.push_back(t);//值為t的元素
? ? ? ? ? ? c.emplace_back(args);//args創(chuàng)建的元素
? ? ? ? ? ?
? ? ? ? ? ? //頭部創(chuàng)建,vector與string不支持
? ? ? ? ? ? c.push_front(t);
? ? ? ? ? ? c.emplace_front(args);
? ? ? ? ? ?
? ? ? ? ? ? //指定位置之前的插入,forwardlist不支持下面的而是有自己專用的insert和emplace
? ? ? ? ? ? c.insert(p,t);//在p迭代器對應(yīng)元素之前插入值為t的元素
? ? ? ? ? ? c.emplace(p,args);
? ? ? ? ? ? c.insert(p,n,t);//n個值為t的元素
? ? ? ? ? ? c.insert(p,b,e);//迭代器范圍[b,e)
? ? ? ? ? ? c.insert(p,il);//花括號元素列表il
? ? ? ?
? ? ? ? ? ? 對象插入或初始化容器后,容器中的對應(yīng)元素與對象并無關(guān)系,對象只是拷貝,類似傳值調(diào)用。
? ? ? ?
? ? ? ? ? ? emplace直接在容器管理的空間中創(chuàng)建對象而不拷貝對象,emplace參數(shù)必須與元素類型構(gòu)造函數(shù)參數(shù)匹配,
? ? ? ?
? ? ? ? 訪問相關(guān)
? ? ? ?
? ? ? ? ? ? 訪問成員函數(shù)返回的是引用
? ? ? ? ? ? front()是首元素(begin()),back是尾元素(end()-1),forwardlist不支持back();
? ? ? ? ? ? c.front(),c.back();
? ? ? ? ? ?
? ? ? ? ? ? 下標(biāo)操作和at()可以隨機(jī)訪問,下標(biāo)需要程序員自己注意越界情況,而at()會在越界的時候自動拋出相關(guān)的out_of_range錯誤
? ? ? ? ? ? c[n],c.at(n);
? ? ? ?
? ? ? ? 刪除相關(guān)
? ? ? ?
? ? ? ? ? ? //forwardlist不支持erase,它有自己專用的刪除函數(shù)
? ? ? ? ? ? //下面操作改變?nèi)萜鞔笮∷圆恢С謅rray
? ? ? ? ? ? c.pop_back();//刪除尾元素,forwardlist不支持
? ? ? ? ? ? c.pop_front();//刪除首元素,vector和string不支持
? ? ? ? ? ?
? ? ? ? ? ? c.erase(p);//刪除p所指向的元素(p是迭代器)
? ? ? ? ? ? c.erase(b,e);//刪除[b,e)范圍內(nèi)的元素
? ? ? ? ? ? c.clear();//刪除所有元素
? ? ? ?
? ? ? ? forwardlist特殊的函數(shù)
? ? ? ?
? ? ? ? ? ? //特殊的迭代器
? ? ? ? ? ? lst.before_begin();//首元素之前不存在的元素迭代器
? ? ? ? ? ? lst.cbefore_begin();
? ? ? ? ? ?
? ? ? ? ? ? //特殊的插入
? ? ? ? ? ? lst.insert_after(p,t);
? ? ? ? ? ? lst.insert_after(p,n,t);
? ? ? ? ? ? lst.insert_after(p,b,e);
? ? ? ? ? ? lst.insert_after(p,il);
? ? ? ? ? ?
? ? ? ? ? ? emplace_after(p,args);
? ? ? ? ? ?
? ? ? ? ? ? //特殊的刪除
? ? ? ? ? ? lst.erase_after(p);
? ? ? ? ? ? lst.erase_after(b,e);
? ?
? ? -? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-14 二 11:50> </span></span> 9.3.5改變?nèi)萜鞔笮?
? ? ? ?
? ? ? ? ? ? c.resize(n);
? ? ? ? ? ? c.resize(n,t);
? ?
? ? -? 9.3.6 容器操作可能會使迭代器失效
? ? ? ?
? ? ? ? ? ? 插入、刪除都可能導(dǎo)致容器迭代器失效,不同容器情況不同(比如vector、list等)具體參考相關(guān)位置。
? ? ? ? ? ?
? ? ? ? ? ? 大致情況如下:
? ? ? ? ? ? 對于插入,
? ? ? ? ? ? 指向list/forwardlist的引用、指針、迭代器都不會失效;
? ? ? ? ? ? vector/string若重新分配則指針、引用、迭代器全失效,若未重新分配則插入之前的引用、指針、迭代器不會失效;
? ? ? ? ? ? deque插入首尾之外則指針、引用、迭代器全失效,插入首尾則迭代器失效但是指向存在的指針、引用不會失效。
? ? ? ? ? ?
? ? ? ? ? ? 對于刪除,
? ? ? ? ? ? 指向被刪元素的迭代器、指針、引用全都失效;
? ? ? ? ? ? 指向list/forwardlist其它位置的引用、指針、迭代器都不會失效;
? ? ? ? ? ? deque刪除首尾之外則其它元素指針、引用、迭代器全失效,刪除尾部則尾后迭代器失效其它不失效,刪除首部則其它都不會被影響。
? ? ? ? ? ? 指向vector/string被刪除元素之前的指針、引用、迭代器都有效。
? ? ? ? ? ? 只要刪除元素,尾后迭代器都失效。
? ? ? ?
? ? ? ? ? ? 對于vector/string/deque,為防止失效,循環(huán)中操作容器后需要更新迭代器、引用、指針。
? ? ? ? ? ? insert()/erase()均會返回新迭代器,用它更新迭代器即可。
? ? ? ? ? ? 類似如下這樣進(jìn)行:
? ? ? ? ? ? inter= vi.insert(...);
? ? ? ? ? ? inter= vi.erase(....);
? ? ? ? ? ?
? ? ? ? ? ? 不要在循環(huán)外保存c.end()返回的尾迭代器做為判斷,而直接每次使用新的返回值
? ? ? ? ? ? 類似如下這樣進(jìn)行:
? ? ? ? ? ? while(begin != v.end())
? ? ? ? ? ? {...}
? ?
? ? -? 9.4 vector對象是如何增長的
? ? ? ?
? ? ? ? ? ? vector元素連續(xù),增加元素會導(dǎo)致重新分配空間,移動所有元素,所以通過一定策略預(yù)先給它分配多余的預(yù)留空間,防止頻繁移動所有元素。
? ? ? ? ? ? capacity()告訴我們不重新分配內(nèi)存(擴(kuò)張)的情況下可以容納多少個元素;reserve告訴我們它應(yīng)當(dāng)預(yù)留準(zhǔn)備保存的元素數(shù)目。
? ? ? ? ? ? c.shrink_to_fit();//將capacity減少到與size(即實際的元素數(shù))同樣大小。
? ? ? ? ? ? c.capacity();//最大能保存的元素數(shù)目,超過則重新分配內(nèi)存。
? ? ? ? ? ? c.reserve(n);//預(yù)留n的空間,不改變?nèi)萜髟財?shù)量,僅影響vector預(yù)先分配多大的空間。
? ? ? ? ? ?
? ? ? ? ? ? 當(dāng)需求大于當(dāng)前容量,reserve才會改變vector容量,至少會分配與需求一樣大的空間;當(dāng)需求小于等于當(dāng)前容量,reservse什么都不做并且小于時也并不會退回多余的空間。當(dāng)調(diào)用reserve之后,capacity空間大小會大于等于傳給reserve的參數(shù)。
? ? ? ? ? ?
? ? ? ? ? ? 總之,reserve不會減少容器占用的空間。類似地,resize只減少容器元素數(shù)目而不是容器容量,也不能用它減少預(yù)留空間。
? ? ? ? ? ?
? ? ? ? ? ? shrink_to_fit()會要求退回多余空間,但是實際也不保證一定退回。
? ? ? ?
? ? ? ? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-19 日 12:15> </span></span> capacity和size
? ?
? ? -? <span class="timestamp-wrapper"><span class="timestamp">[2020-03-17 二 11:48] </span></span> 9.5額外的string操作
? ? ? ?
? ? ? ? ? ? 創(chuàng)建函數(shù):使用const char*創(chuàng)建string對象時,如果未指定創(chuàng)建的大小或者指定的大小大于const char*字符數(shù)目,那么const char*必須以NULL空字符結(jié)束,否則不用。
? ? ? ? ? ? string(s), string(s,pos), string(s,pos,n)
? ? ? ? ? ? substr(pos), substr(pos,n)
? ? ? ? ? ?
? ? ? ? ? ? 修改字符串的操作:insert(),erase(),assign(),append(),replace()
? ? ? ? ? ?
? ? ? ? ? ? 搜索函數(shù):返回string:size_typ類型,是下標(biāo),沒有匹配則返回最大值npos的static成員。
? ? ? ? ? ? find(),rfind(),find_first_of(),find_last_of(),find_first_not_of(),find_last_not_of()
? ? ? ? ? ?
? ? ? ? ? ? 比較函數(shù): compare()
? ? ? ? ? ?
? ? ? ? ? ? 數(shù)值轉(zhuǎn)換:to_string(val),stoi(),stol(),stoul(),stoll(),stoull(),stof(),stod(),stold()