Effective_STL 学习笔记(四十四) 尽量使用成员函数代替同名的算法

 

 

有些容器拥有和 STL 算法同名的成员函数。

关联容器提供了 count、find、lower_bound、upper_bound 和 euqal_range

list 提供了 remove、remove_if、unique、merge 和 reverse

 

大多数时候应该用成员函数代替手写算法,这样做的两个理由:

  比起算法,它们与容器结合的更好(尤其是关联容器)

  同名的算法很成员函数通常不是一样的

 

假设 set<int> 容纳一百万个元素,想找到元素 727 的第一次出现的位置

1   set<int> s;
2   . . .
3   set<int>::iterator i = s.find(727);  // 使用成员函数
4   if( i != s.end() ) . . .
5   set<int>::iterator i = find( s.begin(), s.end(), 727 ); // 使用 find 算法
6   if( i != s.end()) . . .

使用成员函数花费对数时间(set实现为红黑树),使用算法将花费线性时间

 

STL 算法判断两个对象是否相同的方法检查的是它们是否相等,而关联容器是用等价来测试它们的 “同一性”

 

对于标准关联容器,选择成员函数而不是同名算法几个好处,首先,得到对数时间而不是线行时间的性能。其次,判断连个元素 “相同”使用的是等价,这是关联容器的默认定义。第三,当操纵 map 和 multimap 时,可以自动地只处理 key 值而不是(key, value)对。

 

list 的成员函数。每个被 list 作了特化的算法(remove、remove_if、unique、sort、merge 和 reverse)都要拷贝对象,而 list 的特别版本什么都没有拷贝;它们只是简单地操纵连接 list 的节点的指针。算法和成员函数的算法复杂度是相同的。

另外,list 的成员函数的行为和它们的同名算法的行为经常是不相同。如果真想从容器中清除对象,调用 remove、remove_if 和 unique 算法后,必须接着调用 erase 函数;但是,list 的 remove、remove_if 和 unique 成员函数真的去掉了元素,后面不再需要接着调用 erase

在 sort 算法和 list 的成员函数间的一个重要的区别是前者不能用于 list。作为单纯的双向迭代器, list 的迭代器不能传给 sort 算法。merge 算法和 list 的merge 成员函数之间也同样存在巨大差异

 

转载于:https://www.cnblogs.com/kidycharon/p/10052504.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(NFS移植到arm上)编译portmap和nfs-utils

为了在播放机上实现NFS服务器的功能&#xff0c;我们已经在uClibc中打开了完整RPC支持&#xff0c;并且在新编译的内核中打开了NFS服务器支持。此外还有两个软件包也是提供NFS服务所必需的&#xff1a;portmap和nfs-utils。portmap为RPC程序提供端口映射服务&#xff0c;nfs-ut…

HTML5上传预览

http://cobain-li.iteye.com/blog/2296538转载于:https://www.cnblogs.com/winyh/p/7850049.html

支付宝支付

1 申请商户平台 2 申请开放平台 3 申请APP支付 4 创建应用 (名称&#xff0c;logo) 5 生成RSA秘钥&#xff08;公钥&#xff0c;私钥&#xff09; 6 在应用中配置公钥 7 配置其他内容&#xff0c;包括iOS bundle ID。配置安卓包名&#xff0c;和签名。 获取appid&#xff0c;公…

HttpRequest Java原生代码封装

HttpRequest Java原生代码封装 get提交 post提交 name1value1&name2value2 的形式 json形式两种形式 package com.beisun.mbp.mbp.controller;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWrit…

Linux 系统目录

/ 根目录 /bin 存放必要的命令 /boot 存放内核以及启动所需的文件等 /dev 存放设备文件 /etc 存放系统的配置文件 /home 用户文件的主目录&#xff0c;用户数据存放在其主目录中 /lib 存放必要的运行库 /mnt 存放临时的映射文件系统&#xff0c;我们常把软驱和光驱挂装在这里的…

linux多线程学习设置线程调度权限

pthread_setschedparam 设置线程的权限 int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param) 参数 1. target_thread是使用pthread_create所获得的线程ID。   2&#xff0e;线程的调度有三种策略&#xff1a;SCHED_OTHER、…

不可错过的CMS学习笔记

引子 带着问题去学习一个东西&#xff0c;才会有目标感&#xff0c;我先把一直以来自己对CMS的一些疑惑罗列了下&#xff0c;希望这篇学习笔记能解决掉这些疑惑&#xff0c;希望也能对你有所帮助。 CMS出现的初衷、背景和目的&#xff1f; CMS的适用场景&#xff1f; CMS的tr…

团队合作及个人成长

通过前一章的学习&#xff0c;我了解到了关于建模的很多初步的知识&#xff0c;但是这和成为一名软件工程师是远远不够的&#xff0c;完成一个程序通常都是一个团队&#xff0c;而这个团队重要的肯定是需要一些流程&#xff0c;这样才能让程序有条不紊的运行着。在这么一个团队…

相机工作原理

轻轻一按&#xff0c;你的相机就把光子转换为了比特。于是一张相片就保存到了你的 iPhone 里。 让我们假设一下你身处室外&#xff0c;环顾四周。三亿里之外&#xff0c;太阳无时无刻不在发射光子。它们需要花上 8 分钟之久才能到达我们舒适的星球。有一些光子撞击到你周围的物…

Android Studio使用心得

说实话 開始接触这个工具 真的认为非常恶心 毕竟大陆被墙 非常多东西用起来不是非常方便 并且Eclipse转到Android Studio还是一个跨度 废话不多说 以下 讲下我遇到的问题 1. 安装的时候&#xff08;Setup Wizard - Download Components&#xff09; 这个要下载非常长时间 甚至…

CentOS用户和用户组的操作

2019独角兽企业重金招聘Python工程师标准>>> CentOS用户和用户组的操作 長得太帥忚四種檌 关注 2018.05.12 16:40* 字数 312 阅读 115评论 0喜欢 0 用户组的操作 1.添加用户组&#xff1a; groupadd 组名2.修改组名 groupmod -n 新组名 原组名删除用户组groupdel 组…

vue webpack配置分析

写在前面&#xff1a;作为 Vue 的使用者我们对于 vue-cli 都很熟悉&#xff0c;但是对它的 webpack 配置我们可能关注甚少&#xff0c;今天我们为大家带来 vue-cli#2.0 的 webpack 配置分析 vue-cli 的简介、安装我们不在这里赘述&#xff0c;对它还不熟悉的同学可以直接访问 v…

Linux用户空间与内核地址空间

Linux 操作系统和驱动程序运行在内核空间&#xff0c;应用程序运行在用户空间&#xff0c;两者不能简单地使用指针传递数据&#xff0c;因为Linux使用的虚拟内存机制&#xff0c;用户空间的数据可能被换出&#xff0c;当内核空间使用用户空间指针时&#xff0c;对应的数据可能不…

关于主键的设计、primary key

主键&#xff1a;用于唯一标识一个表中一行数据。 外键&#xff1a;用于建立两个表之间的关系&#xff0c;A表中有一列是B表中的主键&#xff0c;那么A表中这列的数据就受到B表主键的约束。 那么关于主键应该如何设计呢&#xff0c;这里我说下优缺点&#xff1a; 1.用自动增长字…

浅谈微信smali注入

作者&#xff1a;郭少雷 搞android搞了几年也没搞出个啥牛逼app出来&#xff0c;眼看时下最火的app微信如此火热&#xff0c;实在想搞搞它&#xff0c;索性就想着给它加点东西进去。 以下内容纯属本人个人爱好&#xff0c;仅限个人学习android用途以及对android的深入了解。 首…

从0到1使用Kubernetes系列(四):搭建第一个应用程序

上一篇文章《从0到1使用Kubernetes系列&#xff08;三&#xff09;&#xff1a;使用Ansible安装Kubernetes集群》中&#xff0c;我们搭建了一套Kubernetes集群&#xff0c;接下来将在本文中介绍如何使用Kubernetes部署一个Nginx并通过Pod IP、Service IP、Ingress这三种方式访问…

Embeded linux之移植iptables

一、内核环境&#xff1a; linux-3.4.35 -*- Networking support ---> Networking options ---> [*] Network packet filtering framework (Netfilter) ---> IP: Netfilter Configuration ---> <*> IP tables support (required for filtering/masq/NAT)…

Hadoop HIVE

数据仓库工具。构建在hadoop上的数据仓库框架&#xff0c;可以把hadoop下的原始结构化数据变成Hive中的表。&#xff08;主要解决ad-hoc query&#xff0c;即时查询的问题&#xff09; 支持一种与SQL几乎完全相同的语言HQL。除了不支持更新&#xff0c;索引和事务&#xff0c;几…

Xcode9学习笔记67 - 打印查看程序沙箱结构中常用的几个目录

override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading the view, typically from a nib.//首先获得应用程序目录的路径&#xff0c;在该目录下有三个文件夹&#xff1a;文档目录、库目录、临时目录以及一个程序包。该目录就是应用程序的…

检测raid类型和磁盘坏道脚本

#!/bin/sh #脚本功能&#xff1a; #安装工具MegaCli64 #Host Information&#xff1a;主机名和ip地址 #Raid Information&#xff1a;raid信息和充电状态 #WARNING Information&#xff1a;MediaErrcount检测坏块和哪块盘 #Disk Information&#xff1a;磁盘信息 #上传MegaC…