set/multiset,map/multimap
内部元素有序排列,新元素插入的位置取决于它的值,查找速度快。
除了各容器都有的函数外,还支持以下成员函数:
find:查找等于某个值的元素
lower_bound:查找某个下界
upper_bound:查找某个上界
equal_range:同时查找上界和下界
count:计算等于某个值的元素个数
insert:用以插入一个元素或一个区间
成员函数
iterator
find
(const T& val);
在容器中查找值为val的元素,返回其迭代器。如果找不到,返回end()。
iterator
insert
(const T& val);
将val插入到容器中并返回其迭代器。
void
insert
(iterator first, iterator last); 将区间[first, last)插入容器。
int
count
(const T& val); 统计有多少个元素的值和val相等。
iterator
lower_bound
(const T& val); 查找一个最大的位置it,使得[begin(), it)中所有的元素都val小。
iterator
upper_bound
(const T& val);
查找一个最小的位置it,使得[it, ebd())中所有的元素都val大。
pair< iterator, iterator>
equal_range
(const T& val); 同时求得lower_bound和upper_bound。
iterator
erase
(iterator it); 删除it指向的元素,返回其后面的元素的迭代器。
set
例:判断某个数在或者不在
void test_set() { set<int> s1; s1.insert(10); s1.insert(3); s1.insert(9); s1.insert(8); s1.insert(1); s1.insert(3); set<int>::iterator it1 = s1.begin(); while (it1 != s1.end()) { cout << *it1 << " "; ++it1; } cout << endl; set<int>::iterator pos = s1.find(3); if (pos != s1.end()) { s1.erase(pos); } if (s1.count(3)) { cout << "在" << endl; } else { cout << "不在" << endl; }
multiset的特性以及用法和set完全相同,唯一区别在于它允许键值重复。
map
map中所有元素都会根据元素的键值自动被排序,map中的所有元素都是pair,同时拥有实值(value)和键值(key),pair的第一个元素被视为键值,第二个元素被视为实值。map不允许两个元素拥有相同的键值。
map的[ ]成员函数
1.insert(value_type(k, T()))
插入操作返回一个pair,其第一个元素是一个迭代器,指向插入的新元素,或指向插入失败(键值)重复的旧元素。
2.取插入操作所返回的pair的第一个元素insert(value_type(k, T()))).first,这第一个元素是一个迭代器,指向被插入的元素。
3.*((this->insert(value_type(k, T()))).first)获取一个map元素,是由一个键值和实值组成的pair,取值第二个元素,即为实值(*((this->insert(value_type(k, T()))).first)).second
例: 统计次数(3种方法)
void test_map() { string strs[] = { "sort", "sort", "second", "sort", "first", "first" }; map<string, size_t> countMap; for (size_t i = 0; i < sizeof(strs) / sizeof(string); ++i) { map<string, size_t>::iterator it = countMap.find(strs[i]); //1.统计次数 if (it != countMap.end()) { it->second++; } else { //countMap.insert(pair<string, size_t>(strs[i], 1));//调构造 countMap.insert(make_pair(strs[i], 1));//调模板函数 } //2.统计次数 pair<map<string, size_t>::iterator, bool> ret = countMap.insert(make_pair(strs[i],1)); if (ret.second == false) { ret.first->second++; } //3.统计次数 countMap[strs[i]]++; } map<string, size_t>::iterator it1 = countMap.begin(); while (it1 != countMap.end()) { cout << it1->first << ":" << it1->second << endl; ++it1; } }
例:字典
void test_map() { map<string, string> dict; dict["sort"] = "排序"; dict["sting"] = "字符串"; dict["left"]; dict["left"] = "左边"; dict["left"] = "剩余"; map<string, string>::iterator it1 = dict.begin(); while (it1 != dict.end()) { cout << it1->first << " :" << it1->second << endl; *it1++; } }
multimap的特性以及用法和map完全相同,唯一区别在于它允许键值重复。