2015/2/10 更新:
今天管理員通知我標題不能寫加號的問題解決了,結果我試了下,還是那破樣子啊。CSDN的MarkDown編輯器着實坑爹啊。昨晚加上今天已經被坑了兩*次了。導致這篇博文是寫的最爛的一篇了,而且沒有任何心情去修改。
標題都沒法寫兩個加號,導致我只能用CPP代替。
0.引言:
容器:一個容器就是一些特定類型對象的集合。
元素在順序容器中的位置與其加入容器時的位置相對應。
關聯容器:其中的元素位置 由相關聯的關鍵字-值決定。
關聯容器的分類:順序和無序。
1.順序容器概述:
1.順序容器:
vector /list /deque /array /string /forward_list
共上述六種。
2.性能折中:
1.向容器添加或者刪除元素的代價。
2.非順序訪問元素的代價。與之對應的是隨機訪問(常見的是下邊)
上面兩者決定了容器之間操作的差異。
示例:向量中沒有push_front 操作。因爲在vector這個容器中頭插元素的代價比較高,所以考慮性能,乾脆就取消這個操作,用insert 代替。
3.array 相關:
此處的array是C++11標準剛剛收錄的。不是我們常見的內置類型數組。但是很多特性一致,比如固定的大小。
4.forward_list 相關:
同array類似,都是C++11 新增的容器類型。單向鏈表。
容器選擇相關:
除非有更好的選擇,否則是推薦使用vector。
2.容器庫概覽:
1.迭代器:
迭代器都定義遞增運算符。有的容器未定義下標運算符,但是容器都定義了迭代器。
2.迭代器範圍:
迭代器範圍概念:此概念是標準庫的基礎。迭代器範圍是由一對指向同一個容器的迭代器表示的範圍。
左閉合區間:表示的範圍是典型的左閉右開。
數學表示:[beg,end) 同數學中的定義一致。隱含的定義了beg<=end.
我們總可以通過反覆遞增到達end。
1.當beg==end時,範圍爲空。
2.beg!=end時,範圍中至少有一個元素。
3.容器的類型成員:
已經使用過的類型: size_type /iterator /const_iterator .
類型別名: 可以在不瞭解容器中具體的元素類型的情況時使用。
元素類型: value_type .容器中元素的類型。
引用類型: reference ,引用類型。
示例:
vector<string>::difference_type count
;
//定義了一個count變量,類型爲difference_type.
4.begin/end 成員:
當調用兩個成員函數時會或者指向首元素和尾後元素的迭代器。
多個版本:帶c表示cosnt,帶r表示反向迭代器。其中c&&r可以組合使用。
5.容器的定義和初始化:
1.除array之外都有default Cstor .
2.只有順序容器才接受大小參數,array除外。
初始化的方式:
1.直接將一個容器初始化爲另一個容器的拷貝,類似於拷貝構造函數和拷貝初始化。array除外。
上面這種情況要注意,容器的類型以及元素的類型要匹配。
2.拷貝一對迭代器指定的範圍。
此種情況下不要求容器類型匹配,只要求元素類型相互關聯即可。
習題解答:
9.1—9.34:
在經歷兩次瀏覽器崩潰,但是CSDN沒有自動保存的情況下,我徹底崩潰了。所以我決定讓那份答案永遠的消失.
9.35
區別:
1.size是當前容器中元素的個數。
2.capacity是容器在未重新分配內存的情況下所能容納的最大數量。
9.36
無可能。因爲capacity是動態分配的。
9.37
1.list的內存佔用不是連續的。
2.array 的是固定大小的。
9.38
#include <vector>
#include <iostream>
#include <list>
using namespace std;
int main(){
vector<int> ivec(10);
cout << "ivec'size is " << ivec.size() << endl
<< "ivec'capacity is " << ivec.capacity() << endl;
ivec.resize(50);
cout << "ivec'size is " << ivec.size() << endl
<< "ivec'capacity is " << ivec.capacity() << endl;
ivec.resize(100);
cout << "ivec'size is " << ivec.size() << endl
<< "ivec'capacity is " << ivec.capacity() << endl;
system("pause");
return 0;
}
9.39
終極目標是調整容器大小爲512.
若讀入的單詞數量小於512,那麼以空字符補齊即可。
若讀入的單詞數量大於512,那麼截去後面多餘的string.
9.40
答案可以參考9.39。
9.41
#include <vector>
#include<iostream>
#include <string>
using namespace std;
int main(){
vector<char> cvec = { 'a', 'f', 'e', 'u' };
string str(cvec.begin(), cvec.end());
for (auto x : str)
cout << x << " ";
cout << endl;
system("pause");
return 0;
}
9.42
**用
vector<string> svec
最好不過了。
9.43
總感覺這個題目出的比較怪。所以我決定跳過去。
9.44
難道你要我用KMP進行匹配?還是你想想用容器
vector<sting>
忘記告訴題目了。
9.45–9.449
略,字符串這裏的題目暫時先放棄了。
9.50
求浮點數略。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
vector<string> svec;
string word;
cout << "Enter strings " << endl;
while (cin>>word){
svec.push_back(word);
}
cout << "The sum is :";
int sum = 0;
for (auto& x : svec){
sum += stoi(x);
}
cout << sum << endl;
system("pause");
return 0;
}
9.51–9.52
略。