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。