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;
}
运行结果: