map/set

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




猜你喜欢

转载自blog.csdn.net/ling_hun_pang_zi/article/details/80356151