上篇博客详细介绍了关联式容器map ,今天我们来了解一下它的姊妹篇–set.
set也属于关联式容器.他们俩底层都由红黑树实现,所以set的查询,插入,删除效率都很高,且
set内的数据也是有序的(默认升序)。但map的缺点set也有,不能够存储不能比较的数据,且数
据不重复。set存储的数据只有key值,但底层仍然按照键值对pair< key key >来存储,即键值与
实值相等.。他和map的区别也就体现在这里了,map可以虽然不能修改键值key,但是可以修
改实值value。而set这个容器就很"自闭",因为键值和实值相等的缘故,任意修改哪个值都
会引起搜索树的乱序。所以记住:这个容器不支持修改!不支持operator[ ],只能插入,删
除,查找。同样,它和multiset之前的区别也只有键值不能够重复这一点。
下面是set容器的源码,我们来看一看。
template,
typename _Alloc = std::allocator<_Key> > //这儿就只传了一个key,不像map传2个
class set
{
public:
typedef _Key key_type;
typedef _Key value_type;//value和key都是key
typedef _Compare key_compare;//比较器,通常传函数指针和仿函数。
typedef _Compare value_compare;
typedef _Alloc allocator_type;
}
以上就是set迭代器的常用函数,其实大多的容器都支持iterator ,const_iterator ,reverse_iterator这3种,没啥好说的。
函数名
|
|
begin | 返回一个迭代器,此迭代器指向set中的第一个元素。 |
cbegin | 返回一个常量迭代器,此迭代器指向set中的第一个元素。 |
cend | 返回一个迭代器,此迭代器指向set最后一个元素的下一个位置 |
clear | 清除set的所有元素。 |
crbegin | 返回一个常量迭代器,此迭代器指向反向set中的第一个元素。 |
crbegin | 返回一个常量迭代器,此迭代器指向反向set中的第一个元素。 |
crend | 返回一个常量迭代器,此迭代器指向反向set中最后一个元素之后的位置。 |
emplace | 将就地构造的元素插入到set。 |
emplace_hint | 将就地构造的元素插入到set,附带位置提示。 |
empty | 如果set为空,则返回 true。 |
end | 返回一个迭代器,此迭代器指向set最后一个元素的下一个位置 |
erase | 从指定位置移除set中的元素或元素范围。 |
find | 返回一个迭代器,此迭代器指向set中其键与指定键相等的元素的位置。 |
get_allocator | 返回集合中与给定值相等的上下限的两个迭代器. |
insert | 将元素或元素范围插入到set中的指定位置。 |
key_comp | 将返回一个用于元素键值比较的函数 |
lower_bound | 返回一个迭代器,此迭代器指向set中其键值等于或大于指定键的键值的第一个元素。 |
max_size | 返回set的最大长度。 |
rbegin | 返回一个迭代器,此迭代器指向反向set中的第一个元素。 |
rend | 返回一个迭代器,此迭代器指向反向set中最后一个元素之后的位置。 |
size | 返回set中的元素数量。 |
swap | 交换两个set的元素。 |
upper_bound | 返回一个迭代器,此迭代器指向set中其键值大于指定键的键值的第一个元素。 |
#include
#include
using namespace std;
void printSet(set& s)
{
for (auto& e : s)
cout << e << " ";
cout << endl;
}
void TestSet()
{
// 用数组array中的元素构造set
int array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
set s(array, array + sizeof(array) / sizeof(array));
cout <<"s.size() = "<< s.size() << endl;
// 正向打印set中的元素,从打印结果中可以看出:set可去重
printSet(s);
s.insert(2);//插入1
s.insert(s.end(), 3);//尾插3
printSet(s);
s.erase(3);//删掉3
set s1(s);//拷贝构造
s.clear();
printSet(s);
}
int main()
{
TestSet();
system("pause");
return 0;
}