set的用法

set的用法

1.定义一个set

set<int> a; //存整形变量
set<string> b; //存字符串
set<double> c; //存小数

2.存入 .insert(x)

a.insert(1); //向a中存入1 -> a={1}
a.insert(3); //向a中存入3 -> a={1,3}
a.insert(2); //向a中存入2 -> a={1,2,3} 这里用到了set的有序性,其中元素会自动排序
b.insert("Hello set!"); //其他数据类型的也同理

3.查看元素数量 .size()

//a={1,2,3}
cout << a.size() << endl;
//输出:3
//.size()返回的是一个整数值,所以直接输出是完全没有问题的

4.调用/查看/迭代器

//a={1,2,3}
//当it指向第二个元素 it -> 2
*it == 2;
it++;
*it == 3;
it--;
it--;
*it == 1;

 

.begin() & .end()
当我们理解了迭代器的基本概念和作用,这两个函数的作用就能轻松的理解了,他们返回的便是集合的首/尾迭代器了

.begin() 返回集合的首迭代器,即指向集合中最小元素的迭代器

.end() 返回集合的尾迭代器,但需要注意的是它指向的并不是集合中的最大元素而是最大元素的后一位,所以如果我们想得到最大元素,我们应该使用的是--.end()(“–”固定在.end()前而不能放在后面)

用法(格式):名称.begin() 名称.end()

//a={1,2,3}

int minn = *a.begin(); //minn=1;
int maxn = *(--a.end()); //maxn=3 
看过.begin()和.end(),我们再回头看一看迭代器的初始化:
set<所对应的set存储的数据类型>::iterator迭代器的名称=所对应的set的名称.begin()或set<所对应的set存储的数据类型>::iterator 迭代器的名称=所对应的set的名称.end()
emm,似乎还是不太便于理解。或许是因为汉字太多了,那么…

a={1,2,3}
set<int> a;
set<int>::iterator it = a.begin();
for(it=a.begin();it!=a.end();it++){
      cout<<*it<<endl;      
}
输出
1
2
3

/*
int与定义a时a的类型保持一致
it为迭代器的名字,可以根据喜好选择
.begin()说明这个迭代器的初始位置是指向a的最小元素的
其余部分是固定的迭代器构造格式
*/

5. .find()

这个函数同样也是与迭代器相关的,它的功能分两部分 1.判断一个元素是否存在于集合中 2.如果存在即返回一个迭代器(如果存在即返回该元素的位置的迭代器,反之则返回集合末尾元素的位置的迭代器(即.end()))
用法(格式):名称.find(x)

set<int> a; //集合a
int x; //查找的元素x
cin >> x;
...
if(a.find(x) != s.end()) { //如果.find()返回的结果不是.end()
    cout << "Have" << endl; //说明集合a中存在x这个元素
}

6.检查集合是否为空 .empty()  

set<int> a;
//不插入任何元素
a.empty() == true;
a.insert(1);//放入一个元素1   ->   a={1}≠Ø
a.empty() == false;

7.检查集合中某一元素的个数 .count()

所以这个函数的返回值显然只有0或1两种可能性,利用这一特点,我们也可以用它来判断一个元素是否存在于集合中…
用法(格式):名称.count(x)

8.清除某一元素 .erase()

这就印证了性质的最后一个,你可以通过.erase()随意清除集合中的某一个元素
用法(格式):名称.erase(x) 此处x可以直接写想要清除的元素,也可以是元素所对应的迭代器

//a={1,2,3}
a.erase(2); //a={1,3}

9.清空set集合 .clear()  

//a={1,2,3}
cout << a.size() << endl; //输出:3
a.clear(); //清空a
cout << a.size() << endl; //输出:0

10.set的二分(.lower _bound() & .upper _bound())  

这两个神奇的东西,我们把他们放在一起看吧
他们与.find()是有相似之处的,都具有查找的功能,但他们查找的内容和条件与.find()有所不同,其中
.lower_bound()表示=> 查找≥x的元素中最小的一个,并返回指向该元素的迭代器
.upper_bound()表示=> 查找>x的元素中最小的一个,并返回指向该元素的迭代器
用法(格式):名称.lower_bound() 名称.upper_bound()

//a={1,2,3}
cout << *(a.lower_bound(2)) << endl;//即输出≥2的第一个元素
//输出:2
cout << *(a.upper_bound(2)) << endl; //即输出>2的第一个元素
//输出:3
a.erase(2);//删除元素2
cout << *(a.lower_bound(2)) << endl; //同样为输出≥2的第一个元素,但此时集合中没有=2的元素,所以等价于输出>2的第一个元素
//输出:3

11..erase()的更多用法

用法(格式):名称.erase(first, last) 即删除[first, last)(注意此处last后面为开区间,即不包括last所指向的元素)内的所有元素,需要注意的是,此处的first和last都必须是迭代器(指针)而不是元素本身。

//a={1,2,3}
cout << a.size() << endl;//输出:3
a.erase(a.find(2), a.end());//即删除由2到末元素(包括2和末尾元素)的所有元素
cout << a.size() << endl;//输出:1   ->   a={1}
//b={1,2,3,4}
cout << b.size() << endl; //输出:4
b.erase(b.find(2), b.find(4)); //即删除由2到4(包括2但不包括4)的所有元素
cout << b.size() << endl; //输出:2   ->   b={1,4}

  

  

  

posted @ 2021-10-31 21:04  lipu123  阅读(408)  评论(0)    收藏  举报