c++primer筆記
加入光榮的進化吧
vector容器
- vector的初始化
- 引用不可以成爲vector的元素,因爲其不是對象。(vector的元素只能是對象。)
- 對象:分配了空間、 並且有數據類型。
- 可以用==花括號==初始化每一個值
- 可以用==括號== 指定元素的個數或相同的元素值
- 只能直接初始化,不能拷貝初始化。(++vector之間可以互相拷貝,但類型要一致++)(++類型即爲定義vector時<>中的內容++);
- vector v1 (==數量==,==內容==); //圓括號
- vector v3{==內容==,==內容==,==內容==}; //花括號
- vector v2 {==數量==,==“內容”==};//花括號
- 引用不可以成爲vector的元素,因爲其不是對象。(vector的元素只能是對象。)
vector添加元素
- C++中,一般在初始化的時候不會設置vector的大小,而是在之後使用中隨用隨加。
vector<int> v2; for(int i=0;i != 100;++i) v2.push_back(i);
- C++中,一般在初始化的時候不會設置vector的大小,而是在之後使用中隨用隨加。
==while(cin>>s)== :一直循環到輸入結束
- toupper(s) 字符s如果爲小寫 則轉換爲大寫。若不是字母,則不變!
isspace(s) 字符s若爲空格,則返回1 否則返回0
vector操作:
- v.empty()
- v.size()
- v.push_back()
- v1=v2
- v1={1,2,3,4,5,6…};
- v1==v2
- v1 != v20
- vector只有使用時纔會分配空間,所以不能通過下標給一個空vector賦值。
確保下標合法的有效手段: ==儘可能使用範圍for語句==
迭代器iterator
- v.begin() v.end();
- auwo b=v.begin(); quto c=v.end();
- begin爲指向第一個元素的迭代器。 end爲指向最後一個元素==下一位==的迭代器。
- v.end()所指向的元素其實沒有實際意義,被稱爲++尾後迭代器++,大多數情況用 if(v.begin==v.end) 判斷迭代器是否爲空。
- 指令:
- *iter :返回迭代器iter所指元素的引用》
- iter->men :解引用iter 並獲取該元素的名爲men的成員。 相當於 (*iter).mem
- ++iter –iter :令iter指示容器的下/上 一個元素。
- 數據類型:
- vector::iterator it;
- string::iterator it2;
- vector::const_iterator it3;
- string::const_iterator it4;
- 如果vector或者string的對象是常量,則只能使用 const_iterator, 若不是常量,則既可以使用iterator 也可以使用const_iterator
iterator和指針的區別
> 1.指針和iterator都支持與整數進行+,-運算,而且其含義都是從當前 位置向前或者向後移動n個位置
> 2.指針和iterator都支持減法運算,指針-指針得到的是兩個指針之間的 距離,迭代器-迭代器得到的是兩個迭代器之間的距離
> 3.通過指針或者iterator都能夠修改其指向的元素
通過上面這幾點看,兩者真的很像,但是兩者也有着下面的幾個不同地方
1.cout操作符可以直接輸出指針的值,但是對迭代器進行在操作的時候會報錯。通過看報錯信息和頭文件知道,迭代器返回的是對象引用而不是對象的值,所以cout只能輸出迭代器使用*取值後的值而不能直接輸出其自身。
2.指針能指向函數而迭代器不行,迭代器只能指向容器
這就說明了迭代器和指針其實是完全不一樣的概念來的。指針是一種特殊的變量,它專門用來存放另一變量的地址,而迭代器只是參考了指針的特性進行設計的一種STL接口。
筆者曾在網上看到這樣一種說法:迭代器是廣義指針,而指針滿足所有迭代器要求。迭代器是STL算法的接口,而指針是迭代器,因此STL算法可以使用指針來對基於指針的非STL容器進行操作。
筆者覺得上面說法也有幾分道理,但是到底正不正確就留給看官自己判斷了。但是有一點希望大家注意的是:千萬不要把指針和迭代器搞混了。也許某些編譯器使用指針來實現迭代器以至於有些人會誤以爲指針和迭代器是一個概念來的。
c++11新加了 cbegin 和cend 指令, 類似於v.begin 但是他們的返回值一律爲const_iterator
箭頭運算符 ->
- 把解引用和成員訪問兩個操作結合。
- it->men 相當於 (*it).men
- 某些vector對象的操作會導致迭代器失效
- ==凡是使用了迭代器的循環體,都不要向迭代器所屬的容器添加元素==
- 任何一種改變vector對象容量的操作 如push_back,都會使該對象的迭代器失效。
- 使用迭代器時! 千萬要記得《解引用》 (在迭代器前加*)!
- 向量初始化後,再使用push_back 就是在那些數後面再插入一些東西。。
- 迭代器運算
- -
- 大概 好像只是對vector和string的迭代器提供了更多的運算符!
- iter + n ; iter -n; 向前、向後移動若干==元素==
- iter1+=n; iter1-=n;
- iter1-iter2 右側迭代器==向前==移動==差值==個元素後得到左側的迭代器
- 例如 auto mid= vi.begin() + vi.size()/2;
- 假設vi中有20個元素 則 *mid 代表的就是vi[10]; (可以用來進行二分排序?)
- 兩個迭代器相減的結果可正可負, 數據類型是 ==difference_type== 代表右側迭代器向前移動多少位置就能追上左側的迭代器。
///二分搜索
auto beg=text.begin(), end=text.end();
auto mid=text.begin()+(end-beg)/2;
while(mid != end && *mid!=sought){
if(sought < *mid)
end = mid;
else
beg = mid + 1;
mid=beg + (end - beg)/2;
}
二分搜索的兩種表達方式
- mid=(end+beg)/2;
- mid=beg+(end-beg)/2;
- 第一種會產生大於end的數值,可能溢出。 第二種算得滿?噗
- 儘量使用第二種。
迭代器 ==*king++== 爲錯
- 寫成 (*king)++ 或者 ++(*king)