简介
一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。这在收集一个数据的具体值的时候是有用的。集合中的元素按一定的顺序排列,并被作为集合中的实例。一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。具体实现采用了红黑树的平衡二叉树的数据结构。
成员函数
复制控制
set::set()
构造函数:创建一个set容器对象,并初始化其内容。
set::~set()
析构函数:销毁一个set容器对象。
set::operator=
为容器分配新的内容以代替其当前内容。
示例代码
#include <iostream>
#include <set>
using namespace std;
bool fncmp(int m, int n)
{
return m < n;
}
class classcmp{
public:
bool operator() (const int& m, int& n) const
{
return m < n;
}
};
int main(void)
{
int arr[] = {1, 2, 3, 4, 5};
// set::set()
set<int> first;
set<int> second(arr, arr+5);
set<int> third(second);
set<int> fourth(third.begin(), third.end());
bool (*fun)(int, int) = fncmp;
set<int, bool (*)(int, int)> fifth(fun);
set<int, classcmp> sixth;
// set::operator=
first = second;
return 0;
}
Iterators
set::begin()
返回指向set容器第一个元素的迭代器,其类型为iterator/const_iterator。
set::end()
返回指向set容器最后一个元素下一个位置的迭代器,其类型为iterator/const_iterator。
set::rbegin()
返回指向set容器最后一个元素的反向迭代器,其类型为iterator/const_iterator。
set::rend()
返回指向set容器第一个元素前一个位置的反向迭代器,其类型为iterator/const_iterator。
set::cbegin()
begin()的const版本,返回值类型为const_iterator。
set::cend()
end()的const版本,返回值类型为const_iterator。
set::crbegin()
rbegin()的const版本,返回值类型为const_iterator。
set::crend()
rend()的const版本,返回值类型为const_iterator。
示例程序
<span style="font-size:18px;">#include <iostream>
#include <set>
using namespace std;
int main(void)
{
int arr[] = {1, 2, 3, 4, 5};
set<int> first(arr, arr+5);
// set::begin() end()
for(set<int>::iterator it=first.begin();
it!=first.end(); ++it){
cout << *it << " ";
}
cout << endl;
// set::rbegin() rend()
for(set<int>::reverse_iterator it=first.rbegin();
it!=first.rend(); ++it){
cout << *it << " ";
}
cout << endl;
// set::cbegin() cend()
for(set<int>::const_iterator it=first.cbegin();
it!=first.cend(); ++it){
cout << *it << " ";
}
cout << endl;
// set::crbegin() crend()
for(set<int>::const_reverse_iterator it=first.crbegin();
it!=first.crend(); ++it){
cout << *it << " ";
}
cout << endl;
return 0;
}</span><span style="font-size:24px;">
</span>
Capacity
set::empty()
判断set容器是否为空,如果为空返回true,否则返回false。
set::size()
返回容器中的元素的个数。
set::max_size()
返回set容器能存储元素的最大数量。
示例程序
<span style="font-size:18px;">#include <iostream>
#include <set>
using namespace std;
int main(void)
{
int arr[] = {1, 2, 3, 4, 5};
set<int> first(arr, arr+5);
// set::empty()
if(!first.empty()){
cout << "First is empty." << endl;
}else{
cout << "First is not empty." << endl;
}
// set::size()
cout << "The size of first is " << first.size() << endl;
// set::max_size()
cout << "The max size of set can hold is " << first.max_size();
cout << endl;
return 0;
}</span><span style="font-size:24px;">
</span>
Modifiers
set:insert()
向容器中插入一个或一组元素。
set::erase()
根据迭代器或值删除容器中的一个或一组元素。
set::swap()
交换两个容器总的元素。
set::clear()
删除容器中的所有元素。
set::emplace()
向容器中插入一个元素,插入的元素由其构造函数构造。
set::emplace_hint()
根据迭代器指定的位置插入一个元素,插入的元素由其构造函数构造。
示例程序
#include <iostream>
#include <set>
using namespace std;
void print(set<int> s)
{
for(set<int>::iterator it=s.begin();
it!=s.end(); ++it){
cout << *it << " ";
}
cout << endl;
}
int main(void)
{
set<int> first;
// set::insert()
first.insert(10);
set<int>::iterator it = first.begin();
pair<set<int>::iterator, bool> ret;
ret = first.insert(10);
if(ret.second == false){
it = ret.first;
}
first.insert(it, 30);
first.insert(it, 20);
int arr[] = {40, 50};
first.insert(arr, arr+2);
print(first);
// set::erase()
it = first.begin();
first.erase(++it);
first.erase(40);
it = first.find(50);
first.erase(it, first.end());
print(first);
//set::swap()
set<int> second(arr, arr+2);
first.swap(second);
print(first);
print(second);
// set::clear()
second.clear();
// set::emplace()
first.emplace(30);
ret = first.emplace(30);
if(ret.second == false){
cout << "30 is already existed." << endl;
}
print(first);
// set::emplace_hint
first.emplace_hint(first.end(), 60);
print(first);
return 0;
}
Observers
set::key_comp()
返回一个key_compare对象,该对象确定了元素在容器中的顺序。它是一个有两个参数的函数指针或函数对象。它参数的类型和set中元素的类型一致,如果第一个参数的值和第二个参数的值满足其默认存储顺序则返回true,否则返回false。
set::value_comp()
在set中,key_comp()和value_comp()是等价的。
示例程序
#include <iostream>
#include <set>
using namespace std;
int main(void)
{
int arr[] = {1, 2, 3, 4, 5};
set<int> first(arr, arr+5);
// set::key_comp()
set<int>::key_compare comp;
comp = first.key_comp();
int highest = *first.rbegin();
set<int>::iterator it = first.begin();
do{
cout << *it << " ";
}while(comp(*it++, highest));
cout << endl;
// set::value_comp()
set<int>::value_compare vcomp;
vcomp = first.value_comp();
it = first.begin();
do{
cout << *it << " ";
}while(comp(*it++, highest));
cout << endl;
return 0;
}
Operators
set::find()
在容器中查找元素,找到返回指向该元素的迭代器,否则返回指向容器最后一个元素的下一个位置的迭代器。
set::count()
计算指定值的元素在容器中的个数,因为set中元素是唯一的,所以其返回值一定为1。
set::lower_bound()
返回指向大于或等于某个值的第一个元素的迭代器
set::upper_bound()
返回指向大于给定值的第一个元素的迭代器。
set::equal_range()
返回集合中与给定值相等的上下限的两个迭代器。
示例代码
#include <iostream>
#include <set>
using namespace std;
void print(set<int> s)
{
for(set<int>::iterator it=s.begin();
it!=s.end(); ++it){
cout << *it << " ";
}
cout << endl;
}
int main(void)
{
int arr[] = {1, 2, 3, 4, 5};
set<int> first(arr, arr+5);
// set::find()
auto it = first.find(3);
if(it != first.end()){
cout << "Found it." << endl;
}else{
cout << "Not found." << endl;
}
// set::count()
cout << "The number is " << first.count(2) << endl;
// set::lower_bound() upper_bound()
set<int>::iterator lowit, upit;
lowit = first.lower_bound(3);
upit = first.upper_bound(4);
first.erase(lowit, upit);
print(first);
// set::equal_range()
pair<set<int>::iterator, set<int>::iterator> ret;
ret = first.equal_range(2);
cout << "The lower bound point " << *ret.first << endl;
cout << "The upper bound point " << *ret.second << endl;
return 0;
}