容器 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是线程安全的集合(也称并发容器 ...
随机推荐
- ora-01445 无法从不带保留关键字的表的联接视图中选择 ROWID 或采样
ora-01445无法从不带保留关键字的表的联接视图中选择 ROWID 或采样 从网上找了很多资料,许多都是没结贴的,说什么的都有,排查了一下sql 发现各个段的left join都没有错误. 有一个 ...
- 转:VC++获取屏幕大小第一篇 像素大小GetSystemMetrics
VC++获取屏幕大小第一篇 像素大小 GetSystemMetrics>和<VC++获取屏幕大小第二篇物理大小GetDeviceCaps 上>和<VC++获取屏幕大小第三篇物理 ...
- android 适配器simpleadapter和baseadapter区别
android 适配器 simpleadapter 和 baseadapter 设计网络程序或者数据处理显示程序的时候,常常会使用 simpleadapter 和baseadapter 来实现. ad ...
- try catch 学习记入
执行过程 public void method(Action action) { //2.method执行中 try { action(); //3.调用委托 "; //如果action执行 ...
- 使用AlertDialog创建对话框的大致步骤
1.创建AlertDialog.Builder对象,该对象是AlertDialog的创建器.2.调用AlertDialog.Builder的方法为对话框设置图标.标题.内容等.3.调用AlertDia ...
- MCS51浮点计算程序
MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示. ;这是本人使用的MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEE ...
- std::vector的分片拷贝和插入
一般我们在用Qt的QByteArrary或者List的时候,会有相应的append的方法,该函数,就是把数据加入末尾.但是std::vector就没有相应的方法.但是我们可以用insert方法来实现: ...
- Codeforces Round #203 - D. Looking for Owls
D. Looking for Owls Emperor Palpatine loves owls very much. The emperor has some blueprints with the ...
- Java枚举7常见种用法
DK1.5引入了新的类型——枚举.在Java中它虽然算个“小”功能,却给我的开发带来了“大”方便. 方法/步骤 用法一:常量 在JDK1.5之前,我们定义常量都是:publicstaticfianl. ...
- 【转】MVC5中的区域(Areas)
MVC本身提倡的就是关注点分离.但是当项目本身的业务逻辑足够复杂,如果所有的业务逻辑都写个Controller文件夹下面的时候,你会看到非常庞大的各种命名的Controller,这个时候区域的作用就非 ...