容器 SET part2
(6) insert STL中为什么提供这样的set的insert呢?
| 这个成员函数存在的目的是为了插入效率的问题。函数参数中的 __position 只是一个提示值,表示在这个位置附近(可前可后)。如果要插入的数据其插入后的位置在 __position 附近的话,使用这个函数可以大大节省插入的时间。反之,如果这两个位置离得很远的话,反而没有用 insert(const value_type& )效率高。 |
et类的 insert() 的实现讲起来较复杂,举一个简单的例子来说明吧。
设有一排好序的整数序列(不妨假定他们存储在一个整型数组中)如下:
0 1 2 2 5 7 12 34 56 89 100 234
如果想插入下列数列到上面的数列中,要求插入后的数列仍保持有序:
15 12 14 20 25 第一个数 15 按照一般的算法(比如从数列开始搜索的方式)插入,得到插入的位置(在 12 之后)。有了这个位置值之后,下一次我们可以把它作为提示值使用,再次插入数据的时候不是从数列的开始处搜索,而是从这个提示位置开始搜索,定位要插入的数据的位置。如果要插入的数据之间比较接近的话(象上面提供的插入数列那样),由于位置比较接近,可以缩短搜索的次数,从而提高插入数据的效率。 还有很重要的一点,就是,参数不同,返回值也是不同的!single element (1)
pair<iterator,bool> insert (const value_type& val);
with hint (2)
iterator insert (iterator position, const value_type& val);
range (3)
template <class InputIterator>
void insert (InputIterator first, InputIterator last);
(7)key_compReturns a copy of the comparison object used by the container.
By default, this is a less object, which returns the same as operator<. 用法:std::set<T> myset; std::set<T>::key_compare mycomp = myset.key_comp()
(8)自定义比较函数#include <set>
struct A
{
int i;
int j;
bool operator<(A const &ref)const
{
return i < ref.i;
}
bool operator==(A const &ref)const
{
return i == ref.i && j == ref.j;
}
};
int main()
{
A val1 = {1, 2};
A val2 = {2,2};
std::set<A> my_set;
my_set.insert(val1);
my_set.insert(val2);
} 也就是说要在A中重载和A相关的比较运算符号!那么如果A 不是类或者结构体,就没办法重做比较函数了?
有办法!
就是set,不是这种set了!
struct SetCompare
{
bool operator()(const MyPair &it1,const MyPair &it2) const
{
if(it1.second >it2.second)
{
return true;
}
else
return false;
}
};
typedef set<MyPair,SetCompare> MyPairSetComP;
MyPairSetComP MyPairContainComp;
这样就可以!
typedef set<MyPair,SetCompare> MyPairSetComP;
typedef set<MyPair> MyPairSet;
MyPairSetComP MyPairContainComp2=MyPairSetComP(SetCompare());///sucess !
MyPairSet MyPairContainComp2=MyPairSet(SetCompare()); /// failed!
容器 SET part2的更多相关文章
- 【K8S学习笔记】Part2:获取K8S集群中运行的所有容器镜像
本文将介绍如何使用kubectl列举K8S集群中运行的Pod内的容器镜像. 注意:本文针对K8S的版本号为v1.9,其他版本可能会有少许不同. 0x00 准备工作 需要有一个K8S集群,并且配置好了k ...
- 把AspDotNetCoreMvc程序运行在Docker上-part2:修改容器以及发布镜像
在上一个part<把AspDotNetCoreMvc程序运行在Docker上-part1>,已经将成功将aspdotnetcore程序运行在两个不同的容器中,目前两个容器的内容完全相同,只 ...
- Docker 容器
1. 容器 在过去,如果要开始编写Python应用程序,首先要做的就是在机器上安装Python运行时环境.但是,这就造成了这样一种情况:你的机器上的环境需要完美,以便你的应用程序能够按预期运行,而且 ...
- Docker学习4-Containers - 容器
用Docker方式构建应用程序,从这个应用程序层次结构的底层容器开始.高于此级别的是一项服务,它定义了容器在生产中的行为方式.在顶层是堆栈,它定义了所有服务的交互. Stack 堆栈 Service ...
- Docker 入门 第二部分: 容器
目录 Docker 入门 第二部分: 容器 先决条件 介绍 你的新开发环境 使用 Dockerfile 定义一个容器 Dockerfile 应用本身 requirements.txt app.py 构 ...
- Docker 入门(Mac环境)- part 2 容器(container)
part-2 容器(container) 简介 Docker架构有三个层面,从高到低如下: stack(栈) services(服务) containers(容器) 现在接触的这些在容器这一层里,类似 ...
- 把AspDotNetCoreMvc程序运行在Docker上-part3:使用独立的存储容器
接上一篇博文<把AspDotNetCoreMvc程序运行在Docker上-part2:修改容器以及发布镜像>,这次我们看看如何使用docker存储数据. 背景 之前的示例都只有一个网站应用 ...
- Docker 入门之docker容器创建
使用docker容器的大多数人都是因为想要隔离不同运行环境的差异,使得自己的应用能更好的移植和部署.那么我们来看看掌握docker需要掌握哪些方面. 1,搭建docker环境 2,编译镜像并将其运行成 ...
- 《深入浅出 Java Concurrency》—并发容器 ConcurrentMap
(转自:http://blog.csdn.net/fg2006/article/details/6404226) 在JDK 1.4以下只有Vector和Hashtable是线程安全的集合(也称并发容器 ...
随机推荐
- Linux查看机器是多少位
命令: file /bin/ls或者file /sbin/init 示例: 如上所示,我的机器是32位的.
- IIS Server Farms集群负载
序言 随着公司业务的发展,后台业务就变的越来越多,然而服务器的故障又像月经一样,时不时的汹涌而至,让我们防不胜防.那么后台的高可用,以及服务器的处理能力就要做一个横向扩展的方案,以使后台业务持续的稳定 ...
- ECMA 6 记入
好书推荐 : http://es6.ruanyifeng.com/ String.prototype -includes, startsWith, endsWith -padStart, padEnd ...
- Practice: Process logs with Apache Hadoop
http://www.ibm.com/developerworks/library/os-log-process-hadoop/ Analyzing Apache logs with Apache P ...
- 系统学下POWERSHELL吧,工作当中可能用得到呢。不能像以前那样修修改改了。
把环境,编辑器,版本这些都弄清楚,说不好还能把FCL类库弄懂个大概???:) [DateTime]::IsLeapYear(2008) $result = [DateTime]"06/21/ ...
- 转: Python 运算符与用法
+加两个对象相加 3 + 5得到8.'a' + 'b'得到'ab'. (注意:6+'a'这样是错误的,但在PHP里这样是可以运行的) -减得到负数或是一个数减去另一个数 -5.2得到一个负数.50 - ...
- Linux系统编程(32)—— socket编程之TCP服务器与客户端
TCP协议的客户端/服务器程序的一般流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后, ...
- 黑马程序员_Java集合Map
Map Map概述: 接口Map<k,v> 类型参数: k-此映射所维护的键的类型 v-映射值的类型 Map集合:该集合存储键值对.一对一对往理存.而且要保证键的唯一性. 嵌套类摘要: s ...
- AsyncTask和Handler的优缺点比较
AsyncTask实现的原理和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口 ...
- linux0.12 学习总序(不断更新状态中)
最近有空闲时间,想静下心来学点东西.一直对kernel有兴趣,又苦于无从下手,就拿linux0.12练手.尝试了解并熟悉kernel各模块工作原理. 接下来的博客主要用来记录自己所遇到的问题和解决的方 ...