Effective STL 条款36

Effective C++ 第三版 所有条款总结及对应代码描述(纯干货) Effective C++ 第三版 所有条款总结及对应代码描述(纯干货) 阅读详情

条款36:了解copy_if的正确实现

STL有很多有趣的地方,其中一个是虽然有11个名字带“copy”的算法:

copycopy_backward
replace_copyreverse_copy
replace_copy_ifunique_copy
remove_copyrotate_copy
remove_copy_ifpartial_sort_copy
unintialized_copy 

但没有一个是copy_if。这意味着你可以replace_copy_if,你可以remove_copy_if,你可以copy_backward或者reverse_copy,但如果你只是简单地想要拷贝一个区间中满足某个判断式(predicate)的元素,你只能自己做。

比如,假设你有一个函数来决定一个Widget是否有缺陷的:

bool isDefective(const Widget& w);

而且你希望把一个vector中所有有缺陷的Widget写到cerr。如果存在copy_if,你可以简单地这么做:

vector<Widget> widgets;
...
copy_if(widgets.begin(), widgets.end(),   // 这无法编译:
  ostream_iterator<Widget>(cerr, "/n"), // STL中并没有copyif
  isDefective);

具有讽刺意味的事,copy_if是最初的惠普STL的一部分,惠普STL形成了STL的基础,而STL现在是标准C++库的一部分。有些怪癖会使历史变得有趣,在从HP STL中为标准筛选出一些大小易于管理的东西时,copy_if成了其中一个在剪接室中被遗弃的东西。

在《The C++ Programming Language》[7],Stroustrup强调写copy_if是微不足道的,他是对的,但那不意味着实现正确的琐事很简单。比如,这里有一个合理的看待copy_if,很多人(包括我)曾经知道的实现:

template<typename InputIterator,    // 一个不很正确的
   typename OutputIterator,  // copy_if实现
   typename Predicate>
OutputIterator copy_if(InputIterator begin,
    InputIterator end,
    OutputIterator destBegin, Predicate p)
{
 return remove_copy_if(begin, end, destBegin, not1(p));
}

这个方法是基于这个观点——虽然STL并没有让你说“拷贝每个判断式为true的东西”,但它的确让你说了“拷贝除了判断式不为true以外的每个东西”。要实现copy_if,似乎我们需要做的就只是加一个not1在我们希望传给copy_if的判断式前面,然后把这个结果判断式传给remove_copy_if,结果就是上面的代码。

如果上面的理由有效,我们就可以用这种方法写出有缺陷的Widget:

copy_if(widgets.begin(), widgets.end(),   // well-intentioned code
  ostream_iterator<Widget>(cerr, "/n"), // that will not compile
  isDefective);

你的STL平台将会敌视这段代码,因为它试图对isDefective应用not1(这个应用出现在copy_if内部)。正如条款41试图将清楚的,not1不能直接应用于一个函数指针,函数指针必须先传给ptr_fun。要调用这个copy_if实现,你必须传递的不仅是一个函数对象,而且是一个可适配的函数对象。这够简单了,但是想要成为STL算法用户的人应该不必这样。标准STL算法从来不要求它们的仿函数是可适配的,copy_if也不应该要求。上面的实现是好的,但不够好。

这是copy_if正确的微不足道的实现:

template<typename InputIterator,    // 一个copy_if的
   typename OutputIterator,  // 正确实现
   typename Predicate>
OutputIterator copy_if(InputIterator begin,
    InputIterator end,
    OutputIterator destBegin,
    Predicate p) {
 while (begin != end) {
  if (p(*begin))*destBegin++ = *begin;
  ++begin;
 }
 return destBegin;
}

告诉你copy_if多有用,加上新STL程序员趋向于希望无论如何它应该存在的事实,所以好的做法是把copy_if——正确的那个!——放在你局部的STL相关工具库中,而且只要合适就使用。

【绝版C++书籍】《Effective STL》读书笔记 《Effective STL》读书笔记写在前面《Effective STL》中可能过时的内容1 容器第1条:慎重选择容器类型。第2条:不要试图编写独立于容器类型的代码。第3条:确保容器中的对象拷贝正确而高效。第4条:调用empty而不是检查size()是否为0。第5条:区间成员函数优先于与之对应的单元素成员函数。第6条:当心C++编译器最烦人的分析机制。第7条:如果入容器中包含了通过new操作创建的指针,切记在容器对象析构前将delete掉。第8条:切勿创建包含auto_ptr的容器对象。第9条:慎重选择删 阅读详情

相关推荐

Effective C++ 总结

当变量定义出现时,程序需要承受其构造成本;当变量离开其作用域时,程序需要承受其析构成本。因此,避免不必要的变量定义,以及延后变量定义式直到你确实需要它。// 效率低// 效率高Widget w;i < n;++i) {w = 取决于 i 的某个值;...这种做法产生的开销:1 个构造函数 + 1 个析构函数 + n 个赋值操作i < n;++i) {Widget w(取决于 i 的某个值);...这种做法产生的开销:n 个构造函数 + n 个析构函数。

qq_31978997的博客 369

Effective STL学习笔记-条款36

了解copy_if的正确实现先看copy和copy_if的使用小demo: vector<int> from(10); std::iota(from.begin(), from.end(), 0); //0 - 9 vector<int> to; //copy std::copy(from.begin(), from.end(), back_in

柠檬柠檬C的博客 288

Python控制tek示波器(1)

如何使用Python来控制tek示波器

m0_47441496的博客 3379

Effective STL 中文版(大全)

候捷说,对于STL,程序员有三个境界,开始是使用STL,然后是理解STL,最后是补充STL。EffectiveSTL是一本非常好的书,帮助你更好的理解STL,其作者就是《EffectiveC++》一书的作者。如果你已经初步了解了STL的容器、迭代器、算法和函数,而又想更好的了解STL,那么《EffectiveSTL》是你的最佳选择。 还有一部分没有找到链接,如果再找不到我会自己试着翻译

幸福村的人 1139

深度学习与神经网络有什么区别

人工神经网络(ArtificialNeuralNetwork,即ANN)是从信息处理角度对人脑神经元网络进行抽象,是20世纪80年代以来人工智能领域兴起的研究热点,其本质是一种运算模型,由大量的节点(或称神经元)之间相互联接构成,在模式识别、智能机器人、自动控制、生物、医学、经济等领域已成功地解决了许多现代计算机难以解决的实际问题,表现出了良好的智能特性。...

super67269的博客 8487

Grok-1.5+Ollama企业级本地化部署与合规实践指南

本文详细介绍了Grok-1.5+Ollama企业级本地化部署与合规实践指南,重点分析了本地化部署的成本优势和数据主权保障。通过RTX 4090显卡的硬件选型、Ubuntu 22.04系统优化及部署流程中的关键陷阱规避,为企业提供了高效、安全的AI模型部署方案。特别适合金融、医疗等敏感行业。

weixin_29094539的博客 180

2 Studying《Effective STL》

《Effective STL》摘要 STL是C++标准库的重要组成部分,涵盖容器、迭代器、算法和函数对象等。本文总结了STL使用中的关键要点: 容器选择: 根据插入删除位置选择序列容器(vector、list、deque) 考虑查找效率选择关联容器(set、map)或哈希容器 指针容器需注意资源管理,建议使用智能指针 容器操作优化: 优先使用empty()而非size()==0 区间操作比单元素操作更高效 使用reserve避免频繁重新分配内存 注意string实现的多样性 算法使用: 确保目标区间足够大

u012906122的专栏 753

金融科技数据源

数字金融开放研究平台

平平淡淡,戒急用忍,一生学闭嘴。 1757

Effective STL 目录

由于没有看内容,有些翻译可能不准确,请见谅:)容器条款1: 仔细选择你要的容器 条款2: 小心对“容器无关代码”的幻想 条款3: 使容器里对象的拷贝操作轻量而正确 条款4: 用empty来代替检查size是否为0 条款5: 尽量使用范围成员函数代替他们的单元素兄弟 条款6: 警惕C++的及其令人恼怒的分析 条款7: 当使用new得指针的容器时,切记在容器销毁前d

AMin2001的专栏 1483

【代码审计】RuoYi定时任务漏洞:从SQL注入到RCE的攻防演变

本文深入剖析了RuoYi框架定时任务模块从早期版本无校验到引入黑白名单机制,再到被组合利用实现RCE的完整漏洞演变过程。文章详细分析了SQL注入与定时任务功能结合导致的远程代码执行漏洞,并总结了代码审计与安全开发的核心要点,为开发者提供了重要的安全参考。

yellow的专栏 699

深入浅出:CosineLRScheduler 调度器的原理与实战应用

本文深入解析了CosineLRScheduler调度器的核心原理与实战应用,详细介绍了余弦退火算法及其在深度学习模型训练中的优势。通过参数配置建议、PyTorch实现示例和常见问题解决方案,帮助开发者高效应用该调度器提升模型性能,特别适用于计算机视觉和自然语言处理任务。

sss66的博客 859

Effective STL目录

    从去年12月开始,我花了40天看了《Effective STL》这本书,并写了相关的读书笔记,我在考虑是否将这部分笔记在BLOG上贴出来。在此之前,先贴上Effective STL目录,并且强烈推荐这本书。如果想加深对STL的了解,这本书必不可少。同时还需要参考的书是《STL源代码剖析》。这篇目录上带有了相关链接。前言致谢导读容器条款1:仔细选择你的容器条款2:小心对“容器无关代码”的幻想

李永亮的专栏 1861

基于 STM32 设计的 HC05 蓝牙音箱

本项目介绍如何使用 STM32 微控制器和 HC05 蓝牙模块设计一个简单的蓝牙音箱。该音箱可以接收来自手机或其他蓝牙设备的音频数据,并通过扬声器播放。该项目展示了如何使用 STM32 微控制器和 HC05 蓝牙模块设计一个简单的蓝牙音箱。易于实现功能实用可扩展性强如果您需要开发一个蓝牙音箱,该项目可以作为参考。

走向CTO的路上... 2470

Effective C++ 条款总结

Effective C++ 条款总结一、让自己习惯C++1 视C++为一个语言联邦2 尽量使用const等替换#define3 尽可能使用const4 确定对象使用前被初始化 自己在看这本书的时候,回去翻看目录的时候,有些规则会被遗忘,因此做个简单的小总结供自己和其他人参考,没读过的还是要先去读一遍的 一、让自己习惯C++ 1 视C++为一个语言联邦 C++是一种包含许多特性的语言,因而不要把它视为一个单一语言。理解C++至少需要学习一下4个部分: C语言。C++仍以C为基础 objected-ori

catkin_ws的博客 1177

OpenClaw 技术架构解析-网关层(上)

OpenClaw 网关层是架构核心中枢,承接Channel层消息,串联消息路由器、会话状态管理器等五大组件,负责消息分发、会话管理、状态统筹、上下文维护等关键职责,是连接Channel层与AI执行引擎的核心桥梁,保障多渠道交互稳定、有序运行。

wend的博客 711

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【C++】万字详解Effective C++

本文为前段时间读《Effective C++》(侯捷译)时做的个人笔记。

Friday 4289

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【一文读懂】《Effective STL》50条有效使用STL的经验

本文按 Scott Meyers《Effective STL》(2001)原书 8 章顺序,系统梳理全部 50 条条款,覆盖容器选型、vector/string、关联容器、迭代器、算法、函数子、STL 实战与其他议题。对初学者易混淆处配代码示例,并在关键处标注 C++11/20 的现代等价写法(如 unordered_map、std::erase_if、lambda 取代 bind1st)。

码工许师傅 366

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Effective STL笔记

#estl 第50条:熟悉与STL相关的web站点。三个:www.sgi.com/tech/stl、www.stlport.org 和 www.boost.org。 #estl 第49条:学会分析与STL相关的编译器诊断信息。嗯,第一招是替换大法,然后介绍了一下与容器、插入迭代器、绑定器、输出迭代器或算法相关的错误大概有什么套路看。 #estl 第48条:总是包含(#include)正确 的头文件...

weixin_34015566的博客 164

「经典研读」Effective STL

研读 Effective STL 时的一些心得和记录,不一定正确,请酌情参考,从容器、迭代器和算法等几个方面展开

士全的优快云,用心连载,欢迎关注 482

Effective STL 精华版读书笔记

文章目录容器vector和string1.仔细选择你的容器2.关联容器且带起算法仿函数、仿函数类、函数等使用STL编程 容器 vector和string 1.仔细选择你的容器 2. 关联容器 且带起 算法 仿函数、仿函数类、函数等 使用STL编程 ...

小鱼酱的博客 679

Effective STL 中文版(完整版)

Winter总算找到《Effective STL》的完整中文版了,奉献给大家。书中作者解释了怎样结合STL组件来在库的设计得到最大的好处。这样的信息允许你对简单、直接的问题开发简单、直接的解决方案,也帮你对更复杂的问题设计优雅的方法。我描述了常见的STL使用错误,而且向你演示怎么避开它们。那帮助你躲开闪资源漏、不可移植的代码和未定义的行为。我讨论了优化代码的方法,所以你能使STL表现得像它应该的那

sdnxiaotao的专栏 1473

Effective STL

Effective STL 中文版(大全)《转》Effective STL 中文版(大全)作者: winter 候捷说,对于STL,程序员有三个境界,开始是使用STL,然后是理解STL,最后是补充STL。Effective STL是一本非常好的书,帮助你更好的理解STL,其作者就是《Effective C++》一书的作者。如果你已经初步了解了STL的容器、迭代器、算法和函数

lihongxue的专栏 767

Effective C++改善程序与设计的55个条款

Cpper分为两种,一种是读过《Effective C++》,另一种是没读过。让我们学习“专家的经验累积”。为啥我比别人踩过的坑更少,那个因为我走的是前人铺平的道路

Lucky_Cpper的博客 1050
上一篇: Effective STL 条款39
下一篇: Effective STL 条款40
AMin2001
博客等级 码龄26年 7粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值