stl學習總結(認識學習階段)

stl是什麼
一系列已經完善的數據結構模板。這些現成的功能性代碼爲程序員提供了很多操作接口,在使用時只需引入相應的頭文件,申請相應的變量,引用成員函數。 stl對程序員來說是方便的工具,學會使用stl可以提高編程效率,另外,stl中的算法已經十分完善,可以間接提高編程正確率。
stl的內容
1.堆棧(stack)
先進後出的數據結構,類似於子彈上膛,對堆棧內元素的操作大多是針對棧頂元素,增刪查。
部分操作語句如下
s.push(x); // 入棧,增
s.pop(); // 出棧,刪
s.top(); // 訪問棧頂,查
s.empty(); // 當棧空時,返回
trues.size(); // 訪問棧中元素個數
2.隊列(queue)
先進先出的數據結構,跟它的名字一樣,隊列類似於排隊,在隊尾添加元素,在隊頭刪減元素,隊尾隊頭元素都可以返回查看。
部分操作語句如下
q.push(x); // 入隊列,增隊尾
q.pop(); // 出隊列,刪隊頭
q.front(); // 訪問隊首元素
q.back(); // 訪問隊尾元素
q.empty(); // 判斷隊列是否爲空
q.size(); // 訪問隊列中的元素個數
3.動態數組(vector)
隨用隨變的數組,動態的增長存儲空間,不用申明大小,可以對其中的任意元素進行增刪查改的操作。
部分操作語句如下
s[i] // 直接以下標方式訪問容器中的元素
s.front() // 返回首元素
s.back() // 返回尾元素
s.push_back(x) // 向表尾插入元素
xs.size() // 返回表長
s.empty() // 表爲空時,返回真,否則返回假s.pop_back() // 刪除表尾元素
s.begin() // 返回指向首元素的隨機存取迭代器s.end() // 返回指向尾元素的下一個位置的隨機存取迭代器
s.insert(it, val) // 向迭代器it指向的元素前插入新元素vals.insert(it, n, val)// 向迭代器it指向的元素前插入n個新元素
vals.insert(it, first, last) // 將由迭代器first和last所指定的序列[first, last)插入到迭代器it指向的元素前面s.erase(it) // 刪除由迭代器it所指向的元素s.erase(first, last)// 刪除由迭代器first和last所指定的序列[first, last)
s.reserve(n) // 預分配緩衝空間,使存儲空間至少可容納n個元素
s.resize(n) // 改變序列長度,超出的元素將會全部被刪除,如果序列需要擴展(原空間小於n),元素默認值將填滿擴展出的空間
s.resize(n, val) // 改變序列長度,超出的元素將會全部被刪除,如果序列需要擴展(原空間小於n),val將填滿擴展出的空間
s.clear() // 刪除容器中的所有元素
s.swap(v) // 將s與另一個vector對象進行交換s.assign(first, last)// 將序列替換成由迭代器first和last所指定的序列[first, last),[first, last)不能是原序列中的一部分
// 要注意的是,resize操作和clear操作都是對錶的有效元素進行的操作,但並不一定會改變緩衝空間的大小
// 另外,vector還有其他的一些操作,如反轉、取反等,不再一一列舉
// vector上還定義了序列之間的比較操作運算符(>、<、>=、<=、==、!=),可以按照字典序比較兩個序列。
總的來說,vector中的元素可以靈活使用。
4.容器(set和multiset)
set沒有重複元素的集合,multiset有重複元素的集合,並且容器中的元素均經過排序。
另外,可以利用set不允許元素重複的特性對數據進行去重。
部分操作如下
s.begin() // 返回指向第一個元素的迭代器
s.clear() // 清除所有元素
s.count() // 返回某個值元素的個數
s.empty() // 如果集合爲空,返回true(真)
s.end() // 返回指向最後一個元素之後的迭代器,不是最後一個元素
s.equal_range() // 返回集合中與給定值相等的上下限的兩個迭代器
s.erase() // 刪除集合中的元素
s.find() // 返回一個指向被查找到元素的迭代器s.get_allocator() // 返回集合的分配器
s.insert() // 在集合中插入元素
s.lower_bound() //返回指向大於(或等於)某值的第一個元素的迭代器
s.key_comp() // 返回一個用於元素間值比較的函數s.max_size() // 返回集合能容納的元素的最大限值s.rbegin()//返回指向集合中最後一個元素的反向迭代器s.rend() // 返回指向集合中第一個元素的反向迭代器s.size() // 集合中元素的數目
s.swap() // 交換兩個集合變量
s.upper_bound() // 返回大於某個值元素的迭代器s.value_comp() // 返回一個用於比較元素
5.關聯容器(map)
包含鍵值和實值,可以通過鍵值查找實值,其關係類似於數組元素與腳標,只不過腳標可以不是數字,map中的關聯關係依靠pair實現。map不允許存在重複鍵值。
部分操作如下
/* 向map中插入元素 /
m[key] = value; // [key]操作是map很有特色的操作,如果在map中存在鍵值爲key的元素對, 則返回該元素對的值域部分,否則將會創建一個鍵值爲key的元素對,值域爲默認值。所以可以用該操作向map中插入元素對或修改已經存在的元素對的值域部分。m.insert(make_pair(key, value)); // 也可以直接調用insert方法插入元素對,insert操作會返回一個pair,當map中沒有與key相匹配的鍵值時,其first是指向插入元素對的迭代器,其second爲true;若map中已經存在與key相等的鍵值時,其first是指向該元素對的迭代器,second爲false。/
查找元素 /int i = m[key]; // 要注意的是,當與該鍵值相匹配的元素對不存在時,會創建鍵值爲key(當另一個元素是整形時,m[key]=0)的元素對。map<string, int>::iterator it = m.find(key); // 如果map中存在與key相匹配的鍵值時,find操作將返回指向該元素對的迭代器,否則,返回的迭代器等於map的end()(參見vector中提到的begin()和end()操作)。
/
刪除元素 /
m.erase(key); // 刪除與指定key鍵值相匹配的元素對,並返回被刪除的元素的個數。m.erase(it); // 刪除由迭代器it所指定的元素對,並返回指向下一個元素對的迭代器。
/
其他操作 */
m.size(); // 返回元素個數
m.empty(); // 判斷是否爲空
m.clear(); // 清空所有元素
map可以嵌套使用,用來表示兩種以上情況的關聯。
6.優先隊列(priority_queue)
一種特殊的隊列,優先隊列與隊列的差別在於優先隊列不是按照入隊的順序出隊,而是按照隊列中元素的優先權出隊列(默認爲大者優先,也可以通過指定算子來指定自己的優先順序)。
priority_queue的基本操作與queue的略微不同。部分操作語句如下
q.empty() // 如果隊列爲空,則返回true,否則返回false
q.size() // 返回隊列中元素的個數
q.pop() // 刪除隊首元素,但不返回其值
q.top() // 返回具有最高優先級的元素值,但不刪除該元素
q.push(item) // 在基於優先級的適當位置插入新元素
7.algorithm
包含很多的模板函數,sort排序,生成排列以及upper_bound lower_bound等等。具體用法不做贅述。
以上stl的內容的頭文件都是用相應的英文名稱引入。
stl例題中的一些函數
1. isalpha
判斷字符ch是否爲英文字母,若爲英文字母,返回非0(小寫字母爲2,大寫字母爲1)。若不是字母,返回0。
2.tolower
把字母字符轉換成小寫,非字母字符不做出處理。
3.stringstream
字符串輸入輸出流
stl很方便,功能衆多,也正是這個原因使得語句衆多,記憶起來難度很高。再就是對於stl的使用還不夠熟練,在很多情況下不知道使用哪種數據結構。需要練習題目進行鞏固。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章