C++关联容器之set类型——《C++ Primer》抄书笔记

set类型

  map类型是键值对的集合,相反地,set容器只是单纯的键的结合。当只想知道一个值是否存在时,使用set容器就是最合适的。

  set容器支持大部分的map操作:

  • 关系运算,类似于string类型的关系运算
    • 如果两个容器具有相同的长度而且所有元素都相等,那么这两个容器就相等;否则,不相等;
    • 如果两个容器的长度不相等,但较短的容器中所有的元素都等于较长容器中对应的元素,则称较短的容器小于另一个;
    • 如果连个容器都不是对方的初始子序列,则它们的比较结果取决于所比较的第一个不相等的元素
  • begin、end、rbegin、rend操作
  • 类型别名(typedef)
  • swap和赋值操作。
  • clear和erase操作。
  • 容器大小的操作,如size(),max_size()等
  • insert、count、find等
  1. set容器的定义和使用

  必须包含set头文件

  • 直接声明空的容器
    • set<int> iset
  • 以一段范围的元素初始化set对象
      vector<int> ivec;
      for(vector<int>::size_type i = 0; i < 10; i++)
      {
          ivec.push_back(i);
          ivec.push_back(i);
      }

      set<int> set2(ivec.begin(), ivec.end());
      for(set_it = set2.begin(); set_it != set2.end(); set_it++)
      {
          printf("%d\t", *set_it);
      }
      printf("\n");

  1.1 在set中添加元素

      vector<int> ivec2;
      for(vector<int>::size_type i = 10; i < 20; i++)
      {
          ivec2.push_back(i);
          ivec2.push_back(i);
      }
      set2.insert(0);//单个的插入
      set2.insert(ivec2.begin(), ivec2.end());//范围插入
      for(set_it = set2.begin(); set_it != set2.end(); set_it++)
      {
          printf("%d\t", *set_it);
      }
      printf("\n");

  1.2从set中获取元素

set2.find(1); //returns iterator that refers to the element whit key == 1

set2.find(21); //returns iterator == set2.end()

set2.count(1); //returns 1
set2.count(21); // returns 0

set和map在遍历,排序效率上都是一样的,其内部都是红黑树作为数据结构.唯一的差别在于set要求容器内元素自带<符号,或者给定外部小于判断式.map则仅仅要求key可排序.虽然说hash检索的效率更高,但是set和map的很多操作会涉及到排序,因此可能是这个原因使得作者们决定用红黑树而不是hash结构。

posted on 2012-04-10 10:58  aho  阅读(2718)  评论(0编辑  收藏  举报

导航