日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++学习——set与map

發布時間:2024/7/19 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++学习——set与map 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.set的使用

set的各成員函數列表如下:1. begin()--返回指向第一個元素的迭代器2. clear()--清除所有元素3. count()--返回某個值元素的個數4. empty()--如果集合為空,返回true5. end()--返回指向最后一個元素的迭代器6. equal_range()--返回集合中與給定值相等的上下限的兩個迭代器7. erase()--刪除集合中的元素8. find()--返回一個指向被查找到元素的迭代器9. get_allocator()--返回集合的分配器10. insert()--在集合中插入元素11. lower_bound()--返回指向大于(或等于)某值的第一個元素的迭代器12. key_comp()--返回一個用于元素間值比較的函數13. max_size()--返回集合能容納的元素的最大限值14. rbegin()--返回指向集合中最后一個元素的反向迭代器15. rend()--返回指向集合中第一個元素的反向迭代器16. size()--集合中元素的數目17. swap()--交換兩個集合變量18. upper_bound()--返回大于某個值元素的迭代器19. value_comp()--返回一個用于比較元素間的值的函數 #include<iostream> #include<set> using namespace std;/* * set最常用于查找set數據結構中是否有某個數據 */ int main() {set<string> st;st.insert("ssfs");st.insert("ssf4qqa");st.insert("i love you");st.insert("z");st.insert("az");st.insert("i love you");//重復的會自動舍棄cout << "st.size()=" << st.size() << endl;cout <<"*st.begin()="<< *st.begin() << endl;set<string>::iterator it;for (it = st.begin(); it != st.end(); it++) {cout << *it << endl;}string str = "i love you";cout << "st.count(str)=" << st.count(str) << endl;if (st.find("country") == st.end()) { //很常用的用法cout << "st中沒有" << "\"country\""<< endl;}return 0; } st.size()=5 *st.begin()=az az i love you ssf4qqa ssfs z st.count(str)=1 st中沒有"country"

2.map的使用

這一部分參考:map的常見用法

#include<iostream> #include<map> using namespace std;/* * map是STL(中文標準模板庫)的一個關聯容器。 *可以將任何基本類型映射到任何基本類型。 */ int main() {//1.map的定義map<string, int> m;//2.map元素的插入//2.1 使用數組方式插入m["i"] = 1;m["love"] = 2;m["you"] = 3;m["you"] = 4;//m["you"]=4將取代m["you"]=3m["bo"] = 6;//2.2 m.insert(pair<string, int>(key,value));m.insert(pair<string, int>("zhong", 21));//2.3 m.insert(map<string,int>::value_type(key, value));m.insert(map<string, int>::value_type("guo", 1949));//3.map中元素的遍歷map<string, int>::iterator it;for (it = m.begin(); it != m.end(); it++) {cout << it->first << " " << it->second << endl;}//4.map的查找,find(key): 若key存在,則返回key對應的迭代器,否則返回m.end()string str4 = "zhng";if (m.find(str4) != m.end()) {cout << "存在key=" << str4 << " value=" << m[str4] << endl;}else {cout << "不存在key=" << str4 << endl;}//5,map的size和emptycout << "m中的元素個數:" << m.size() << endl;//6.map的清空,刪除某個元素// m.clear();清空//刪除m.erase("zhong");//maps.erase(maps.begin(), maps.end());//全刪除map<string, int>::iterator it6;for (it6 = m.begin(); it6 != m.end(); it6++) {cout << it6->first << " " << it6->second << endl;}return 0; } bo 6 guo 1949 i 1 love 2 you 4 zhong 21 不存在key=zhng m中的元素個數:6 bo 6 guo 1949 i 1 love 2 you 4

3.set和map的底層實現

map和set都是C++的關聯容器,其底層實現都是紅黑樹(RB-Tree)。由于 map 和set所開放的各種操作接口,RB-tree 也都提供了,所以幾乎所有的 map 和set的操作行為,都只是轉調 RB-tree 的操作行為。

4.set和map的區別

  • map中的元素是key-value(關鍵字—值)對:關鍵字起到索引的作用,值則表示與索引相關聯的數據;Set與之相對就是關鍵字的簡單集合,set中每個元素只包含一個關鍵字。

  • set的迭代器是const的,不允許修改元素的值。map允許修改value,但不允許修改key。其原因是因為map和set是根據關鍵字排序來保證其有序性的,如果允許修改key的話,那么首先需要刪除該鍵,然后調節平衡,再插入修改后的鍵值,調節平衡,如此一來,嚴重破壞了map和set的結構,導致iterator失效,不知道應該指向改變前的位置,還是指向改變后的位置。所以STL中將set的迭代器設置成const,不允許修改迭代器的值;而map的迭代器則不允許修改key值,允許修改value值。

  • map支持下標操作,set不支持下標操作。map可以用key做下標,map的下標運算符[ ]將關鍵碼作為下標去執行查找,如果關鍵碼不存在,則插入一個具有該關鍵碼和mapped_type類型默認值的元素至map中,因此下標運算符[ ]在map應用中需要慎用,const_map不能用,只希望確定某一個關鍵值是否存在而不希望插入元素時也不應該使用,mapped_type類型沒有默認值也不應該使用。如果find能解決需要,盡可能用find。

  • 總結

    以上是生活随笔為你收集整理的C++学习——set与map的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。