原文
set本身接口
初始化
声明一个空的数组
std::set<int> Set1;
声明一个set,初始化数据未数组的前四个数据,并且会将该4个数据进行排序,默认从大到小
int myints[] = { 10, 20, 50, 30, 40 };
std::set<int> Set2(myints, myints + 5);
以其他set数据进行初始化
std::set<int> Set3(Set2);
以其他数据进行初始化,初始化的数据为set2的初始位置到end前一位,并且不包含该位置
std::set<int> Set4(Set2.begin(), --Set2.end());
自定义排序方式,从大到小排序
struct SetCompare {
bool operator() (const int& lhs, const int& rhs) const
{
return lhs > rhs;
}
};
int myints[] = { 10, 20, 50, 30, 40 };
std::set<int, SetCompare> Set5(myints, myints + 5);
自定义函数指针排序方式,在添加数据时会按照Compare进行比较再次排序
static bool Compare(int lhs, int rhs) { return lhs<rhs; }
bool(*fn_pt)(int, int) = Compare;
std::set<int, bool(*)(int, int)> Set6(fn_pt); // function pointer as Compare
添加元素
添加一个元素,需要注意的是,如果set中原本存在这个元素,则不会添加成功
Set6.insert(10);
ret中的值为两个,当set1中存在5时,返回的bool值为false。迭代器指向这个元素,如果原有set1中不存在5,则会在set中加入5,并且bool值为true,迭代器为指向这个新元素的迭代器
std::pair<std::set<int>::iterator, bool> ret = Set1.emplace(5);
该方法需要额外传入一个迭代器,用来指明新元素添加到 set 容器的具体位置(新元素会添加到该迭代器指向元素的前面);
返回值是一个迭代器,而不再是 pair 对象。当成功添加元素时,返回的迭代器指向新添加的元素;反之,如果添加失败,则迭代器就指向 set 容器和要添加元素的值相同的元素。同时,set会重新排序;
std::set<int>::iterator ret = Set1.emplace_hint(Set1.begin(),12);
删除元素
删除元素为5的值
Set1.erase(5);
从it位置开始一直删除到++(++it1)处,但不包含++(++it1)
auto it = Set1.find(5);
auto it1 = it;
Set1.erase(it, ++(++it1));
删除it
auto it = Set1.find(5);
Set1.erase(it);
全部清空
Set1.clear();
元素个数
Set1.size()
是否为空
如果为空返回true,不为空返回false
Set1.empty()
是否含有某个值
如果存在返回1,不存在返回0
myset.count(i)
遍历
for (auto it = Set1.begin(); it != Set1.end(); it++)
{
std::cout << *it << std::endl;
}
检查某个值是否存在
返回这个值的迭代器,如果该迭代器指向end则表明数组中不存在该元素,否则迭代器指向该元素
it = myset.find(60);
获取与给定值相关的迭代器
返回与给定值9相关的两个迭代器,第一个迭代器为等于9的迭代器的值,第二个值为第一个大于9的迭代器的值;那个不存在则会返回end
std::pair<std::set<int>::const_iterator, std::set<int>::const_iterator> ret;
ret = Set1.equal_range(9);
获取第一个小于等于5的迭代器的位置
auto itlow = Set1.lower_bound(5); // ^
获取第一个大于5的迭代器的位置
auto itup = Set1.upper_bound(5);
交换两个set
first.swap(second);
反向迭代器
指向最后一个元素的迭代器,执行++与–均与begin相反
Set1.rbegin()
指向第一个数组的反向迭代器,功能与正想的end()类似
Set1.rend()
使用
for (std::set<int>::reverse_iterator rit = Set1.rbegin();
rit != Set1.rend(); ++rit)
自定义结构体排序
自定义结构体定义
class MyClass
{
public:
int i;
};
采用函数指针判断
static bool Compare(MyClass lhs, MyClass rhs) { return lhs.i >rhs.i; }
std::set<MyClass,bool(*)(MyClass,MyClass)> Set1(Compare);
采用仿函数进行比较 判断
struct SetCompare {
bool operator() (const MyClass& lhs, const MyClass& rhs) const
{
return lhs.i > rhs.i;
}
};
std::set<MyClass, SetCompare> Set1;
重写<运算符
class MyClass
{
public:
bool operator< ( const MyClass& rhs) const
{
return this->i < rhs.i;
}
public:
int i;
};
std::set<MyClass> Set1;