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完全相同,唯一区别在于它允许键值重复。