版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013919153/article/details/82454547
/**
template < class T, // set::key_type/value_type
class Compare = less<T>, // set::key_compare/value_compare
class Alloc = allocator<T> // set::allocator_type
> class set;
**/
#define VNAME(value) {cout<<(#value)<<":"<<endl;}
template<class T>
void print_elemnt(T &v)
{
for(auto i : v)
cout<<i<<" ";
cout<<endl;
}
bool fncomp (int lhs, int rhs) {return lhs<rhs;}
struct classcomp {
bool operator() (const int& lhs, const int& rhs) const
{return lhs<rhs;}
};
void test_set(){
//关于构造函数,可以指定比较函数,内存分配函数,区间赋值,拷贝构造
set<int,classcomp> a;
set<int> b;
set<int> c(b);
//set<int> d(c.begin(),c.end());
//set<int> e(fncomp);
/**
迭代器:begin,end,rbegin,rend及对应的const
set的迭代器不能与整数进行加操作,因为内存不是连续的,底层实现红黑树
**/
//a.size();
//a.max_size();
if (a.empty())
{
cout<<"a is empty."<<endl;
}
//返回值为pair<iterator,bool>,存在导致插入失败
auto i = a.insert(2);
cout<<"a insert 2 result:"<<i.second<<endl;
a.insert(4);
a.insert(7);
a.insert(a.begin(),3);
c.insert(a.begin(),a.end());
//b.emplace(1,2,3,4); //错误,一次只能插入一个元素
b.emplace(6);
b.emplace_hint(b.cend(),9); //指定位置插入一个值,插入数据就会排序,所以没啥用感觉
VNAME(b)
print_elemnt(b);
a.erase(a.begin()); //删除具体某个位置的值,返回删除最后一个元素的下一个元素的迭代器
a.erase(7); //删除值,返回为删除的个数,这里为0或者1
//a.erase(first,last); //删除一段区间
cout<<"size of a:"<<a.size()<<endl;
cout<<"max_size of a :"<<a.max_size()<<endl;
b.swap(c); //交换内容
VNAME(b)
print_elemnt(b);
//a.key_comp(); //返回键比较函数
//a.value_comp(); //返回值比较函数
auto key_iter = a.find(1); //得到一个值所对应迭代器。不存在返回set::end()
auto num = a.count(1); //计算一个值出现次数,这里为0或者1
//说明:默认情况下lower_bound返回该元素的迭代器,
// upper_bound返回该元素下一个元素的迭代器
// 如果指定比较函数,lower_bound则返回comp(element,val) return false 对应元素的迭代器
// upper_bound则返回key_comp(val,element) return true的元素的迭代器
auto low = a.lower_bound(2);
auto high = a.upper_bound(3); //一般这两个值配合erase删除一段区间
auto range = a.equal_range(3); //返回值等于某一值的区间范围,用于multiset。区间为[,)
cout<<"lower_bound :"<<*range.first<<endl;
cout<<"upper_bound :"<<*range.second<<endl;
b.clear(); //清空内容
VNAME(a)
print_elemnt(a);
VNAME(c)
print_elemnt(c);
VNAME(b)
print_elemnt(b);
a.insert(2);
a.insert(1);
a.insert(5);
for (auto iter_i = a.begin(); iter_i != a.end();)
{
cout<<*iter_i<<" ";
if (*iter_i == 2)
{
//a.erase(iter_i++);
iter_i = a.erase(iter_i);
/*这里说明下,为什么顺序容器中必须赋值给迭代器,而不能使用自增的原因
*关联容器删除之后只是该元素对应的迭代器失效,而顺序容器删除一个元素后,后面所有元素的迭代器都失效
*/
}else
{
iter_i++;
}
}
cout<<endl;
print_elemnt(a);
/**
**multiset和set功能函数类似,只不过multiset允许重复值存在
**/
multiset<int> Mula;
Mula.insert(1);
Mula.insert(2);
Mula.insert(3);
Mula.insert(1);
Mula.insert(2);
auto it = Mula.find(1); //返回第一个值相等元素的迭代器,也即比较函数返回false时的直对应的迭代器
it++;
cout<<" 1 pos "<<*it<<endl;
//可以使用equal_range获取相同值的范围
VNAME(Mula)
print_elemnt(Mula);
cout<<endl<<endl;
}