C++ set使用详解

发布于 / C语言 / 0 条评论

set也是C++标准模板库(STL)中封装的一个非常实用的容器。与vector等容器不同之处在于,set是一个内部自动排序、自动去除重复元素的容器。接下来说说它的使用方法。

0x01、定义

首先引入头文件:

#include <set>
using namespace std;

接着定义一个set:

set<ElementType> name;

这样就定义了一个类型为ElementType,名称为name的set。

0x02、访问元素

与vector不同,set只能用迭代器去访问(你可以把迭代器理解成是一个指针。。)。定义迭代器用如下方式:

set<ElementType>::iterator it;

这样就定义了一个名字叫it的set的迭代器。并且可以使用 *it 访问set内的元素。例如

it = name.begin();   //name的开头
it = name.end();   //name的末尾

这里特别注意下,set容器不支持*(it+1)之类的访问方式,必须用枚举的方式访问。在这里举个例子,提供两种访问方式:

#include <cstdio>
#include <set>
using namespace std;
typedef set<char> setChar;

int main(void){
  setChar st;
  st.insert('b');  //插入元素 
  st.insert('a');
  st.insert('e');
  st.insert('d');
  st.insert('c');
  for(setChar::iterator i = st.begin(); i!= st.end(); i++){  //第一种方式 
    printf("%c ", *i);
  }
  printf("\n");
  setChar::iterator it = st.begin();
  for(int i = 0; i < st.size(); i++ ,it++){  //第二种方式 
    printf("%c ", *it);
  }
  return 0;
}

运行结果:

0x03、插入或删除元素

使用insert(x)可以将x插入到set容器中,并且set内的元素可以自动递增排序,并且去除重复元素。时间复杂度为O(log(len))。

使用erase函数可以实现删除元素。用法如下:

name.erase(it)可以删除迭代器指向的元素。时间复杂度为O(1)。

name.erase(n)可以删除name容器中,值为n的元素,时间复杂度为O(log(len))。

name.erase(start_it,end_it)可以删除两个迭代器之间(用区间表示就是[start_it,end_it))的元素。时间复杂度为O(end_it-start_it)。

使用name.clear()函数可以清空name容器中的所有元素。时间复杂度为O(len)。

0x04、查找元素、获取元素个数

使用name.find(n)可以查找name容器中n元素,返回的是n元素对应的迭代器。时间复杂度为O(len)。

使用name.size()可以获得name容器的元素个数。

0x05、举例

举个完整的例子吧:

#include <cstdio>
#include <set>
using namespace std;
typedef set<char> setChar;

int main(void){
  setChar st;
  st.insert('b');  //插入元素 
  st.insert('a');
  st.insert('e');
  st.insert('d');
  st.insert('c');
  for(setChar::iterator i = st.begin(); i!= st.end(); i++){
    printf("%c ", *i);
  }
  printf("\n");
  st.erase(st.find('d'));  //删除元素d 
  for(setChar::iterator i = st.begin(); i!= st.end(); i++){
    printf("%c ", *i);
  }
  printf("\n");
  st.erase(st.find('a'),st.find('c'));  //删除a到c之间的元素
  for(setChar::iterator i = st.begin(); i!= st.end(); i++){
    printf("%c ", *i);
  }  
  return 0;
}

运行结果:

转载原创文章请注明,转载自: 斐斐のBlog » C++ set使用详解
目前还没有评论,快来抢沙发吧~