set/multiset 的特性是所有元素会根据元素的值自动进行排序。set 是以 RB-tree(红黑树,平衡二叉树的一种)为底层机制,其查找效率非常好。set 容器中不允许重复元
素,multiset 允许重复元素。
我们可以通过 set 的迭代器改变元素的值吗?
答: 不行,因为 set 集合是根据元素值进行排序,关系到 set 的排序规则,如果任意改变 set 的元素值,会严重破坏 set 组织。
#include <iostream>
#include <set>
#include <list>
#include <string>
using namespace std; void PrintSet(set<int>& s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
} class mycompare
{
public:
bool operator()(int v1, int v2)
{
return v1 > v2;
}
}; // set初始化
// set<T> st;//set 默认构造函数:
// mulitset<T> mst; //multiset 默认构造函数:
// set(const set &st);//拷贝构造函数
void test01()
{
set<int> s1; // 自动进行排序, 默认从小到大
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert();
PrintSet(s1);
// 赋值操作
// set& operator=(const set &st);//重载等号操作符
// swap(st);//交换两个集合容器
set<int> s2;
s2 = s1;
PrintSet(s2);
// 删除操作
// insert(elem);//在容器中插入元素。
// clear();//清除所有元素
// erase(pos);//删除 pos 迭代器所指的元素,返回下一个元素的迭代器。
// erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
// erase(elem);//删除容器中值为 elem 的元素。
s1.erase(s1.begin());
s1.erase();
PrintSet(s1);
cout << "----------------------" << endl;
} // set查找
// find(key);//查找键 key 是否存在,若存在,返回该键的元素的迭代器;若不存在,返回 map.end();
// lower_bound(keyElem);//返回第一个 key>=keyElem 元素的迭代器。
// upper_bound(keyElem);//返回第一个 key>keyElem 元素的迭代器。
// equal_range(keyElem);//返回容器中 key 与 keyElem 相等的上下限的两个迭代器。
void test02()
{
set<int> s1;
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert();
set<int>::iterator ret = s1.find();
if (ret == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "ret: " << *ret << endl;
}
// 找第一个大于key的值
ret = s1.upper_bound();
if (ret == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "ret: " << *ret << endl;
}
// equal_range 返回Lower_bound 和 upper_bound值
pair<set<int>::iterator, set<int>::iterator> myret = s1.equal_range();
if (myret.first == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "myret: " << *(myret.first) << endl;
}
if (myret.second == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "myret: " << *(myret.second) << endl;
}
cout << "----------------" << endl;
} class Person
{
public:
Person(int age, int id) :id(id), age(age){}
public:
int id;
int age;
}; class mycompare2
{
public:
bool operator()(Person p1, Person p2)
{
if (p1.id == p2.id)
{
return p1.age > p2.age;
}
else
{
p1.id > p2.id;
}
}
}; void test03()
{
set<Person, mycompare2> sp;
Person p1(, ), p2(, ), p3(, );
sp.insert(p1);
sp.insert(p2);
sp.insert(p3);
Person p4(, );
for (set<Person, mycompare2>::iterator it = sp.begin(); it != sp.end(); it++)
{
cout << (*it).age << " " << (*it).id << endl;
}
set<Person, mycompare2>::iterator ret = sp.find(p4);
if (ret == sp.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "找到:" << (*ret).id << " " << (*ret).age << endl;
}
} // 对组 void test04()
{
// 构造方法
pair<int, int> pair1(, );
cout << pair1.first << " " << pair1.second << endl;
pair<int, string> pair2 = make_pair(, "aaaaa");
cout << pair2.first << " " << pair2.second << endl;
pair<int, string> pair3 = pair2;
} int main()
{
test01();
test02();
test03();
test04();
getchar();
return ;
}

C++ STL 之 set 和 pair的更多相关文章

  1. STL之map与pair与unordered_map常用函数详解

    STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...

  2. stl(set和pair)

    D - 4 Gym - 100989D In this cafeteria, the N tables are all ordered in one line, where table number ...

  3. UVA 10763 Foreign Exchange 出国交换 pair+map

    题意:给出很多对数字,看看每一对(a,b)能不能找到对应的(b,a). 放在贪心这其实有点像检索. 用stl做,map+pair. 记录每一对出现的次数,然后遍历看看对应的那一对出现的次数有没有和自己 ...

  4. make_pair

    Utilities <utility> 由短小精干的类和函数构成,执行最一般性的工作. 这些工具包括: general types 一些重要的C函数 numeric limits Pair ...

  5. Codeforces Round 500 (Div 2) Solution

    从这里开始 题目地址 瞎扯 Problem A Piles With Stones Problem B And Problem C Photo of The Sky Problem D Chemica ...

  6. 【转】c++ make_pair函数使用

    [好记性不如烂笔头:在<C++ Templates>看到这个函数,发现正是前段时间写项目程序所要用到的,可惜当时还不知道有这个用法,当时是自己写了个结构体..]Utilities < ...

  7. C++11--Tuple类<tuple>

    #include "stdafx.h" #include <iomanip> #include <condition_variable> #include ...

  8. 洛谷 P1954 [NOI2010]航空管制

    https://www.luogu.org/problemnew/show/P1954 拓扑排序, 注意到如果正着建图("a出现早于b"=>"a向b连边" ...

  9. STL的pair学习, map学习

    http://blog.csdn.net/calvin_zcx/article/details/6072286 http://www.linuxidc.com/Linux/2014-10/107621 ...

随机推荐

  1. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_06-vuejs研究-vuejs基础-v-on指令

    3.v-on绑定一个按钮的单击事件 计算的按钮上加事件 点击计算的按钮,弹出的事件 定义一个Result的变量

  2. zabbix 启动报错 cannot set resource limit: [13] Permission denied

    zabbix 启动报错 cannot set resource limit: [13] Permission denied 1.zabbix-server 启动报错 报错信息如下: ::140823. ...

  3. Linux 常用高效操作

    空行处理 linux系统下删除空行,用vim底行模式'%s/^n$//g' 可以删除空行并真正修改文件,但文件数量太大时耗时不可预估,于是操作文件删除空行并重定向到一个新的文件是不错的选择. 常用特殊 ...

  4. Data - 数据挖掘的基础概念

    主要内容来自于<微信公众号:程SIR说> 1 数据挖掘 数据挖掘(Data Mining,简称DM),是指从大量的数据中,挖掘出未知的且有价值的信息和知识的过程. 数据挖掘是一门交叉学科, ...

  5. 第二章 python之计算机基础

    @python基础 零基础就是个幌子,因为零基础什么都干不了. 如果零基础随随便便就把自动化做起来,那自动化测试就不值钱了:因为这种简单的事情,谁都可以做到. 本课程从零基础出发,补足基础后,不仅仅学 ...

  6. 安装flask_mysqldb出现报错问题解析

    安装 mysqldb (pip3 install Flask-MySQLdb)报错 EnvironmentError: mysql_config not found ERROR: Command er ...

  7. shell学习笔记3-后台执行命令

    cron 系统调度进程,使用它在每天的某时间或一周.一月的不同时间运行 at 使用它在一个特点的时间允许一些特殊的作业 & 使用它在后台允许一个占用时间不长的进程 Nohup 使用它在后台运行 ...

  8. 36.HTTP协议

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  9. jqGrid只向服务器请求一次的设置

    也就是说,在表格初始化时请求一次服务器,以后翻页就不再请求服务器,翻页的也只是初始化数据. 一次复制别人的代码时,一直不知道为什么翻页不请求服务器. 搞到人都爆炸,原来只是一个设置的地方. loado ...

  10. 粒子群优化算法(PSO)的基本概念

    介绍了PSO基本概念,以及和遗传算法的区别: 粒子群算法(PSO)Matlab实现(两种解法)