某同學:“你直接用STL不就好了!!!搞這麼麻煩幹嘛!”
我:“我tm就是不用你想怎麼滴!!!我就是*外面,從這裏*下去,也不會*STL一下!”
我現在有種不祥的預感。。。怎麼某定理又要應驗了QAQ。
一.vercot
我在藍書(注:《算法進階指南》)上看到過vector描述,但是那時候覺得這是個什麼玩意兒?有什麼鳥用嗎?現在才發現它原來也有些用處。
1.介紹:
vector是C++標準模板庫中的部分內容,中文偶爾譯作“容器”,但並不準確。它是一個多功能的,能夠操作多種數據結構和算法的模板類和函數庫。vector之所以被認爲是一個容器,是因爲它能夠像容器一樣存放各種類型的對象,簡單地說,vector是一個能夠存放任意類型的動態數組,能夠增加和壓縮數據。--by 百度百科。
2.函數及其用法:
先看看vector的函數列表:
constructors 構造函數
operators 對vector進行賦值或比較
assign() 對vector中的元素賦值
at() 返回指定位置的元素
back() 返回最末一個元素
begin() 返回第一個元素的迭代器
capacity() 返回vector所能容納的元素數量(在不重新分配內存的情況下)
clear() 清空所有元素
empty() 判斷vector是否爲空(返回true時爲空)
end() 返回最末元素的迭代器(實際上指向最末元素的下一個位置)
erase() 刪除指定元素
front() 返回第一個元素
get_allocator() 返回vector的內存分配器
insert() 插入元素到vector中
max_size() 返回vector所能容納元素的最大數量(上限)
pop_back() 移除最後一個元素
push_back() 在vector最後添加一個元素
rbegin() 返回vector尾部的逆迭代器
rend() 返回vector起始的逆迭代器
reserve() 設置vector最小的元素容納數量
resize() 改變vector元素數量的大小
size() 返回vector元素數量的大小
swap() 交換兩個vector
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
現在我們講講函數的具體用法。
這麼多的函數,並不是全部都十分有用,這裏我們只討論一些比較常見的。
首先,vector支持基礎的運算符操作(==,!=,>=,<=,>,<),但是這個比較的標準是什麼呢?標準是兩個vector內有相同的容量,所有相等位置的元素相同。訪問位置與數組相同
at()函數使用方法:
因爲vector支持隨機訪問,因此少不了RE的可能性。。。at函數雖然效果和[]類似,但是它相對於[]顯得更加的安全,因爲它並不會出現越界訪問這種東西。類數組訪問:v[x],at函數訪問方法v.at(x);
front()&back()函數:
這兩個函數第一個返回第一個元素,另一個返回最末元素。用法:v.front(),v.back()。
begin()&end()函數:
這又是一對函數,其中前者返回當前vector起始元素的迭代器,後者則返回的是vector末尾元素的迭代器,利用這兩個函數我們可以很好地遍歷vector數組。用法:v.begin(),v.end()。
注:上文提到的遍歷方法的代碼:
for(it=v.begin();it!=v.end();it++)
cout<<*it;
clear()函數:
用來清空一個vector,用法:v.clear();
empty()函數:
用來判斷vector是否爲空,用法:v.empty(),如果爲空則爲真,反之爲假。
erase()函數:
該函數用來刪除vector裏的元素,既可以刪除一個位置的也可以刪除一個區間的(注:左閉右開)。
用法:v.erase(iterator x)(刪除一個位置),v.erase(iterator x,iterator y)(刪除[x,y))區間。
insert()函數:
該函數用來插入元素,常用操作是在一個元素前面插入另一個元素,用法:v.insert(iterator x,y)即在x這個位置前插入一個y。
pop_back()&push_back()函數:
前者刪除末尾元素,後者在末尾添加元素,用法:v.pop_back(),v.push_back()。
size()函數:
返回當前vector中所含元素個數,用法:v.size()。
3.相關例題及其分析:
知道這麼多是不是很想去嘗試一下呢?
此處先空,有空整理。
二.set
1.介紹:
set是個什麼鬼玩意兒?我也不知道,查查百度百科先,巧了,沒有!(反正我沒查到)那看看別人的介紹吧。
關於set,必須說明的是set關聯式容器。set作爲一個容器也是用來存儲同一數據類型的數據類型,並且能從一個數據集合中取出數據,在set中每個元素的值都唯一,而且系統能根據元素的值自動進行排序。應該注意的是set中數元素的值不能直接被改變。C++ STL中標準關聯容器set, multiset, map, multimap內部採用的就是一種非常高效的平衡檢索二叉樹:紅黑樹,也稱爲RB樹(Red-Black Tree)。RB樹的統計性能要好於一般平衡二叉樹,所以被STL選擇作爲了關聯容器的內部結構。(紅黑樹是啥?這邊)
2.函數及其用法:
看看set的函數列表。
begin():返回指向第一個元素的迭代器
clear():清除所有元素
count():返回某個值元素的個數
empty():如果集合爲空,返回true
end():返回指向最後一個元素的迭代器
equal_range():返回集合中與給定值相等的上下限的兩個迭代器
erase():刪除集合中的元素
find():返回一個指向被查找到元素的迭代器
get_allocator():返回集合的分配器
insert():在集合中插入元素
lower_bound():返回指向大於(或等於)某值的第一個元素的迭代器
key_comp():返回一個用於元素間值比較的函數
max_size():返回集合能容納的元素的最大限值
rbegin():返回指向集合中最後一個元素的反向迭代器
rend():返回指向集合中第一個元素的反向迭代器
size():集合中元素的數目
swap():交換兩個集合變量
upper_bound():返回大於某個值元素的迭代器
value_comp():返回一個用於比較元素間的值的函數
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
接着講講用法。
其實常用的函數也不多。
begin()&end()函數:
其中前者返回set起始元素的迭代器,後者則返回的是set末尾元素的迭代器,用法:set.begin(),set.end()。注意:同其它許多STL一樣,set.end()返回的是最後元素迭代器的後一個元素!!!
clear()函數:
用來清空set,用法:set.clear();
empty()函數:
用來判斷set是否爲空,是爲真,否則爲假。用法:set.empty();
count()函數:
用來返回set中某個元素的個數,用法:set.count();
erase()函數:
刪除set中的一個元素,並返回下個元素的迭代器。
find()函數:
尋找set中某個元素,並返回該元素的迭代器,若不存在返回set.end(),用法:set.find();
lower_bound()&upper_bound()函數:
lower_bound()函數返回set中大於等於一個元素的元素的迭代器。
upper_bound()函數返回set中大於一個元素的元素的迭代器。
若沒有兩者都會返回set.end(),用法:set.lower_bound(x),set.upper_bound(),其中x爲要查找的元素。
insert()函數:
在set中插入一個元素,但是由於set中不存在相同元素,所以當元素已存在時會插入失敗。所以在使用完此函數之後會返回插入位置的迭代器和是否插入成功的bool合併而成的pair。
size()函數:
返回set中的元素個數。
3.相關例題及其分析:
Oh,shift,我現在又多了一個坑代填。。。