c++ stl中標準關聯容器set, multiset, map, multimap內部採用的就是一種非常高效的平衡檢索二叉樹:紅黑樹,也成為rb樹(red-black tree)。rb樹的統計效能要好於一般平衡二叉樹,所以被stl選擇作為了關聯容器的內部結構。
set裡元素唯一,且預設從小到大排序。
總的內建函式:
1. begin()--返回指向第乙個元素的迭代器
2. clear()--清除所有元素
3. count()--返回某個值元素的個數
4. empty()--如果集合為空,返回true
5. end()--返回指向最後乙個元素的迭代器
6. equal_range()--返回集合中與給定值相等的上下限的兩個迭代器
7. erase()--刪除集合中的元素
8. find()--返回乙個指向被查詢到元素的迭代器
9. get_allocator()--返回集合的分配器
10. insert()--在集合中插入元素
11. lower_bound()--返回指向大於(或等於)某值的第乙個元素的迭代器
12. key_comp()--返回乙個用於元素間值比較的函式
13. max_size()--返回集合能容納的元素的最大限值 int:214748364 ll:178956970
14. rbegin()--返回指向集合中最後乙個元素的反向迭代器
15. rend()--返回指向集合中第乙個元素的反向迭代器
16. size()--集合中元素的數目
17. swap()--交換兩個集合變數
18. upper_bound()--返回大於某個值元素的迭代器
19. value_comp()--返回乙個用於比較元素間的值的函式
常用函式:
1、set輸出最小與最大元素
int min, max;
min = *set_.begin();
max = *set_.end();
//特別的:
iter = set_.end();
cout<<*iter<2、set迭代器與反向迭代器
setset_;
up(i, 1, 8) set_.insert(i);
set::iterator iter = set_.begin();
while(iter != set_.end()) printf("%d ", *iter++);
puts("");
set::reverse_iterator riter = set_.rbegin();
while(riter != set_.rend()) printf("%d ", *riter++);
puts("");
輸出結果:
1 2 3 4 5 6 7 8
8 7 6 5 4 3 2 1
3、set刪除元素
/***
erase(iterator); //刪除定位器iterator指向的值
erase(first,second); //刪除定位器first和second之間的值
erase(key_value); //刪除鍵值key_value的值
***/
/***刪除5***/
set_.erase(set_.find(5));
set_.erase(lower_bound(set_.begin(), set_.end(), 5));
set_.erase(set_.lower_bound(5));
set_.erase(set_.find(5), set_.find(6)); //左閉右開
set_.erase(5);
set::iterator iter = set_.begin();
while(iter != set_.end()) printf("%d ", *iter++);
puts("");
4、set查詢
if(set_.find(9) == set_.end()) cout<<"查詢不到"<5、set自定義排序
特別的對於string的長度進行排序:
struct cmp_string_m_n
//注意 如果set_插入為
};setset__;
set__.insert("aa");
set__.insert("ab");
set__.insert("abc");
set::iterator iter = set__.begin();
while(iter != set__.end()) cout<< *(iter++) << ' ';
puts("");
//輸出結果 : abc aa
其他自定義排序:
//普通的
struct cmp_int_m_n
};//結構體
struct node
;struct cmp_node_m_n
};int main()
); set_.insert();
set_.insert();
set_.insert();
set_.insert();
set::iterator iter = set_.begin();
while(iter != set_.end()) printf("%d %d\n", iter->x, iter->y), iter++;
puts("");
}//執行結果:
1 22 5
2 42 3
3 6
顧名思義,可以儲存重複的元素;有一點需要特別注意:刪除的時候:
int main()
};int main()
//執行結果:
1
專案收穫小總結
提交時顯示到瀏覽器時設定字符集!request.setcharacterencoding 字符集 互相轉碼 xm urlencoder.encode xm,utf 8 xm urldecoder.decode xm,iso 8859 1 轉字元string yxdm new string reque...
日常小知識
關閉php警告報錯 error reporting 0 linux查詢檔案命令 find name print 獲取網頁內容 file get contents url 開啟mysql 慢查詢 log slow queries long query time 1 log long format 開啟...
日常學習 STL之map
對map最初的印象,源於王建德老師在山東noip夏令營上那銷魂的一句 map,i,j 音 嘜頗,挨,傑 ruka上對map並沒有講很多,ty菌說map主要用來寫雜湊 雖然她曾用它寫過鄰接矩陣 迴圈巢狀map intorz 而李晨和里奧甚至表示基本不用map。但是既然有這一項奇妙的東西,想必是有用的,...