C++ Primer 筆記+習題解答(九)

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

略。

發佈了53 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章