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. Android中利用jsoup解析html页面

    学习jsoup :jsoup学习网站 Android 中使用: 添加依赖 implementation 'org.jsoup:jsoup:1.10.1' 直接上代码: package com.load ...

  2. 大数据(2)---HDFS集群搭建

    一.准备工作 1.准备几台机器,我这里使用VMware准备了四台机器,一个name node,三个data node. VMware安装虚拟机:https://www.cnblogs.com/niju ...

  3. mysql自身报错、java、reids连接mysql数据库报错汇总

    1.Can't connect to local MySQL server through socket 'tmpmysql.sock' (2) 原因是mysql根本没有启动 2.Access den ...

  4. maven-mybatis代码生成

    1.创建测试工程 选择maven Project 点击next 填写项目名称 点击 finish 项目创建完成 2.pom.xml <project xmlns="http://mav ...

  5. [Python[PyQt]] ModuleNotFoundError: No module named 'PyQt5.QtWebEngineWidgets'

    解决办法: pip install PyQtWebEngine

  6. Lua实现简单的类,继承,多态 实例

    -- 类的例子,长方形的类,具备一个打印面积方法和一个设置长宽的方法 --lua实现类的思路,定义出来的对象在lua中可以访问自己有的成员,访问成员函数实际上是通过元表的__index方法实现的,具体 ...

  7. OpenCV 例程

    采集图片显示视频: #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using n ...

  8. 【Qt开发】Qt5 中对 C++11 一些新特性的封装

    C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性. 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C ...

  9. js 监听音频视频控件是否播放

    监听onplaying: var myVideo=document.getElementById("video1"); myVideo.addEventListener(" ...

  10. 通过JS动态追加标签,以父评论子评论为例

    以下代码前后端交互以Django模板语法为例 先来以伪代码来示意用法: HTML部分: JS动态插入部分代码: 运行之后我们来浏览器看检查打印的内容: 看插入前后打印结果我们可以得知 $title[0 ...