C++STL标准库学习笔记(五)set
前言:
在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,这一篇后面主要都是我的记录了,为了防止大片蓝色字体出现,后面就不改蓝色了。
在上篇博客的时候就在想multiset去掉multi会是啥,然后就来到了这一节,set。
1.1 set的作用
set和multiset的区别在于容器内不能有重复元素
a和b重复等价于“a必须排在b前面”和“b必须排在a前面”都不成立。这都强调多少次了,不过每一次都不一样就是了,这里是重复,之前是相等以及排序。
set插入元素可能不成功
使用时同样要注意#include
1.2 set的用法
也先给上代码样例:
1 #include样例2 #include 3 #include<set> 4 using namespace std; 5 6 int main(int argc, char const *argv[]) 7 { 8 set<int> st; 9 int a[10] = {1,2,3,8,7,7,5,6,8,12}; 10 for (int i = 0; i < 10; i++) 11 { 12 st.insert(a[i]); 13 } 14 cout< //结果:8 15 //这里就是set的特色所在了,7和7,8和8重复了,只留下了一个7和一个8 16 set<int>::iterator i; 17 for ( i = st.begin(); i != st.end(); i++) 18 { 19 cout<<*i<<",";//结果:1,2,3,5,6,7,8,12, 20 }//没有重复元素 21 cout<<endl; 22 pair<set<int>::iterator,bool>result = st.insert(2); 23 //我试了下,这个insert的返回值也是pair类型,first是 24 //iterator,second是bool,所以说不能调换位置。 25 /* 26 pair ::iterator,bool> 27 等价于 28 struct 29 { 30 set::iterator first; 31 bool second; 32 } 33 */ 34 if (!result.second)//条件成立说明插入不成功 35 {//此时first这个迭代器就会指向那个重复的元素 36 cout<<*result.first<<" already exists."<<endl; 37 } 38 else 39 { 40 cout<<*result.first<<" inserted."<<endl; 41 }//结果:2 already exists. 42 return 0; 43 }
老样子,我们从代码里找出有用的地方来简单介绍。
1、set的建立:
set
st.insert(a[i]);
这个插入就会体现出set的特色了,样例中插入了10个元素,输出st.size()时却只有8的大小,这是因为输入了两个7和两个8,因为重复,所以插入♂不了了。
2、pair
我们在程序中使用了pair
在这个地方:
pair
等价于:
1 struct 2 { 3 set<int>::iterator first; 4 bool second; 5 }result;
而:
pair
1 struct 2 { 3 T1 first; 4 T2 second; 5 };
例如:pair
等价于:
1 struct 2 { 3 int first; 4 double second; 5 }a; 6 a.first = 1; 7 a.second = 93.93;
最后补充一下:
刚刚调试了一下发现insert()的返回值是pair类型,其中first是iterator类型,指向已经插入了的那个值的位置,second是bool类型,用于反馈插入是否成功。成功和失败都会用迭代器返回值的位置,成功时second的值为true,失败时为false,可以拿上面样例改个数字进行调试而知道这个结果。顺带一提,first和second调换先后会报错,就是说不能pair
后记:
这里主要介绍了set和pair的用法,不知道STL标准库还有多少多少东西可以研究(挺有意思的),老师推荐了一本书《C++标准库》,等书到了我就去把一些常用的STL标准库中的东东做成笔记扔进博客。感谢大家读到这里,祝大家青春永驻,byebye~~~。