C++提高编程 3 STL常用容器 -set/multiset容器
2022/2/26 9:21:47
本文主要是介绍C++提高编程 3 STL常用容器 -set/multiset容器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
3.8 set/multiset容器
3.8.1 set基本概念
简介:所有元素都会在插入时自动被排序
本质:set/multiset属于关联式容器,底层结构是用二叉树实现
set和multiset区别:
set不允许容器中有重复的元素
multiset允许容器中有重复元素
3.8.2 set构造与赋值
功能描述:创建set容器以及赋值
构造:
set<T> st; //默认构造函数
set(const set &st); //拷贝构造函数
赋值:
set& operator=(const set &st);//重载等号操作符
set:
#include<iostream> #include<set> using namespace std; #include<string> //set容器构造和赋值 void printSet(set<int>&s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { set<int>s1; //插入数据只有insert方式 s1.insert(30); s1.insert(10); s1.insert(40); s1.insert(20); s1.insert(30); //遍历容器 //set特点:1、所有元素再插入的时候会自动排序 2、不允许插入重复值 printSet(s1); //10 20 30 40 //拷贝构造 set<int>s2(s1); printSet(s2); //10 20 30 40 //赋值 set<int>s3; s3 = s2; printSet(s3); //10 20 30 40 } int main() { test1(); system("pause"); return 0; }
multiset:
#include<iostream> #include<set> using namespace std; #include<string> //multiset容器构造和赋值 void printmultiSet(multiset<int>&s) { for (multiset<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { multiset<int>s1; //插入数据只有insert方式 s1.insert(30); s1.insert(10); s1.insert(40); s1.insert(20); s1.insert(30); //遍历容器 //set特点:1、所有元素再插入的时候会自动排序 2、不允许插入重复值 printmultiSet(s1); //10 20 30 30 40 //拷贝构造 multiset<int>s2(s1); printmultiSet(s2); //10 20 30 30 40 //赋值 multiset<int>s3; s3 = s2; printmultiSet(s3); //10 20 30 30 40 } int main() { test1(); system("pause"); return 0; }
3.8.3 set大小和交换
功能描述:
统计set容器大小以及交换set容器
函数原型:
size(); //返回容器中元素个数
empty(); //判断容器是否为空
swap(); //交换两个集合容器
#include<iostream> #include<set> using namespace std; //set容器大小和交换 void printSet(set<int>&s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } //大小 void test1() { set<int>s1; s1.insert(10); s1.insert(40); s1.insert(20); s1.insert(30); if (s1.empty()) { cout << "set s1容器为空" << endl; } else { cout << "set s1容器不为空" << endl; printSet(s1); //10 20 30 40 cout << "s1的大小为:" << s1.size() << endl; //s1的大小为:4 } } //交换 void test2() { set<int>s1; s1.insert(10); s1.insert(40); s1.insert(20); s1.insert(30); set<int>s2; s2.insert(50); s2.insert(70); s2.insert(60); s2.insert(80); cout << "交换前:" << endl; printSet(s1); //10 20 30 40 printSet(s2); //50 60 70 80 cout << "交换后:" << endl; s1.swap(s2); printSet(s1); //50 60 70 80 printSet(s2); //10 20 30 40 } int main() { test1(); test2(); system("pause"); return 0; }
3.8.4 set插入和删除
功能描述:set容器进行插入数据和删除数据
函数原型:
insert(elem); //在容器中插入元素
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器
erase(elem); //删除容器中值为elem的元素
#include<iostream> using namespace std; #include<set> //set容器 插入与删除 void printSet(set<int>& s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { set<int>s; //插入 s.insert(20); s.insert(10); s.insert(30); s.insert(50); s.insert(40); printSet(s); //10 20 30 40 50 //删除 s.erase(s.begin()); printSet(s); //20 30 40 50 s.erase(30); printSet(s); //20 40 50 s.erase(s.begin(),s.end()); printSet(s); //打印一行空白 s.clear(); printSet(s); //打印一行空白 } int main() { test1(); system("pause"); return 0; }
3.8.5 set查找与统计
功能描述:对set容器进行查找数据以及统计数据
函数原型:
find(key); //查找key是否存在,若存在,返回该键的迭代器;若不存在,返回set.end();
count(key); //统计key的元素个数 //对set而言,统计元素的个数的结果,要么是0,要么是1。但multiset可以统计真实个数
set:
#include<iostream> using namespace std; #include<set> //set容器 插入与删除 void printSet(set<int>& s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { set<int>s; //插入 s.insert(30); s.insert(20); s.insert(30); s.insert(10); s.insert(30); s.insert(50); s.insert(30); s.insert(40); s.insert(30); printSet(s); //10 20 30 40 50 //cout << "set容器中30的数量:" << s.find(30) << endl; //想法错了 set<int>::iterator pos = s.find(50); if (pos != s.end()) { cout << "找到元素:" << *pos << endl; } else { cout << "未找到元素!" << endl; } } //统计 void test2() { set<int>s; //插入 s.insert(30); s.insert(20); s.insert(30); s.insert(10); s.insert(30); s.insert(50); s.insert(30); s.insert(40); s.insert(30); printSet(s); //10 20 30 40 50 int num = s.count(30); //对set而言,统计元素的个数的结果,要么是0,要么是1 cout << "所要统计的元素个数为:" << num << endl; //num = 1 } int main() { test1(); test2(); system("pause"); return 0; }
multiset:
#include<iostream> using namespace std; #include<set> //multiset容器 插入与删除 void printMultiet(multiset<int>& s) { for (multiset<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { multiset<int>s; //插入 s.insert(30); s.insert(20); s.insert(30); s.insert(10); s.insert(30); s.insert(50); s.insert(30); s.insert(40); s.insert(30); printMultiet(s); //10 20 30 30 30 30 30 40 50 //cout << "set容器中30的数量:" << s.find(30) << endl; //想法错了 multiset<int>::iterator pos = s.find(50); if (pos != s.end()) { cout << "找到元素:" << *pos << endl; } else { cout << "未找到元素!" << endl; } } //统计 void test2() { multiset<int>s; //插入 s.insert(30); s.insert(20); s.insert(30); s.insert(10); s.insert(30); s.insert(50); s.insert(30); s.insert(40); s.insert(30); printMultiet(s); //10 20 30 30 30 30 30 40 50 int num = s.count(30); //对multiset而言,统计元素的个数的结果是真实的个数 cout << "所要统计的元素个数为:" << num << endl; //num = 5 } int main() { test1(); test2(); system("pause"); return 0; }
3.8.6 set和multiset区别
区别:
1、set不可以插入重复数据,而multiset可以;
2、set插入数据的同时会返回插入结果,表示插入是否成功
3、multiset不会检测数据,因此可以插入重复数据
总结:如果不允许插入重复数据就用set,如果需要插入重复的数据就要用multiset;
#include<iostream> using namespace std; #include<set> //set容器与multiset容器区别 void printSet(set<int>& s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { set<int>s; //不允许插入重复值 pair<set<int>::iterator, bool>ret = s.insert(10); if (ret.second) //ret的第二个参数 即bool为真,表示插入成功 { cout << "第1次插入成功!" << endl; //第1次插入成功! } else { cout << "第1次插入失败!" << endl; } ret = s.insert(10); //再插一次10 if (ret.second) { cout << "第2次插入成功!" << endl; } else { cout << "第2次插入失败!" << endl; //第2次插入失败! } multiset<int>ms; //允许插入重复值 ms.insert(10); ms.insert(10); ms.insert(10); ms.insert(10); for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++) { cout << *it << " "; //10 10 10 10 } cout << endl; } int main() { test1(); system("pause"); return 0; }
这篇关于C++提高编程 3 STL常用容器 -set/multiset容器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享
- 2024-11-22ansible 的archive 参数是什么意思?-icode9专业技术文章分享
- 2024-11-22ansible 中怎么只用archive 排除某个目录?-icode9专业技术文章分享
- 2024-11-22exclude_path参数是什么作用?-icode9专业技术文章分享
- 2024-11-22微信开放平台第三方平台什么时候调用数据预拉取和数据周期性更新接口?-icode9专业技术文章分享
- 2024-11-22uniapp 实现聊天消息会话的列表功能怎么实现?-icode9专业技术文章分享
- 2024-11-22在Mac系统上将图片中的文字提取出来有哪些方法?-icode9专业技术文章分享
- 2024-11-22excel 表格中怎么固定一行显示不滚动?-icode9专业技术文章分享
- 2024-11-22怎么将 -rwxr-xr-x 修改为 drwxr-xr-x?-icode9专业技术文章分享
- 2024-11-22在Excel中怎么将小数向上取整到最接近的整数?-icode9专业技术文章分享