前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >跟Google学写代码--Chromium/base--stl_util源码学习及应用

跟Google学写代码--Chromium/base--stl_util源码学习及应用

作者头像
程序员的酒和故事
发布于 2018-03-12 09:17:06
发布于 2018-03-12 09:17:06
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

Chromium是一个伟大的、庞大的开源工程,很多值得我们学习的地方。

今天与大家分享的就是Chromium下base中的stl_util,是对stl的补充,封装,更有利于我们的使用,完全可以移植到自己的C++工程项目中来。

1 释放STL内存 Clears internal memory of an STL object.

我们知道,vector的clear()方法式清除了vector中的内容,但是vector object所占的内存不会清除。

因此,std_util中有个这个方法:

代码语言:text
AI代码解释
复制
template<class T>void STLClearObject(T* obj) {
  T tmp;
  tmp.swap(*obj);  // Sometimes "T tmp" allocates objects with memory (arena implementation?).  // Hence using additional reserve(0) even if it doesn't always work.
  obj->reserve(0);
}

也就是使用swap,之前写过一篇博客: 《实战c++中的vector系列–正确释放vector的内存(clear(), swap(), shrink_to_fit())》 地址:http://blog.csdn.net/wangshubo1989/article/details/50359750

2 释放容器内的指针对象 这里隐藏了一个巨大的坑儿,就是迭代器的失效问题,之前也有博客里面介绍过:

《实战c++中的vector系列–可怕的迭代器失效(vector重新申请内存)》 地址:http://blog.csdn.net/wangshubo1989/article/details/50334297

《实战c++中的vector系列–可怕的迭代器失效之二(删除vector中元素)》 地址:http://blog.csdn.net/wangshubo1989/article/details/50334503

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class ForwardIterator>void STLDeleteContainerPointers(ForwardIterator begin, ForwardIterator end) {  while (begin != end) {
    ForwardIterator temp = begin;
    ++begin;    delete *temp;
  }
}

3 正确删除容器内pairs对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class ForwardIterator>void STLDeleteContainerPairPointers(ForwardIterator begin,
                                    ForwardIterator end) {  while (begin != end) {
    ForwardIterator temp = begin;
    ++begin;    delete temp->first;    delete temp->second;
  }
}

4 删除容器内pairs对象中的第一个元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class ForwardIterator>void STLDeleteContainerPairFirstPointers(ForwardIterator begin,
                                         ForwardIterator end) {  while (begin != end) {
    ForwardIterator temp = begin;
    ++begin;    delete temp->first;
  }
}

5 删除容器内pairs对象中的第二个元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class ForwardIterator>void STLDeleteContainerPairSecondPointers(ForwardIterator begin,
                                          ForwardIterator end) {  while (begin != end) {
    ForwardIterator temp = begin;
    ++begin;    delete temp->second;
  }
}

6 vector转为数组 一定要注意,vector可能为空的情况下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<typename T>inline T* vector_as_array(std::vector<T>* v) {  return v->empty() ? NULL : &*v->begin();
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<typename T>inline const T* vector_as_array(const std::vector<T>* v) {  return v->empty() ? NULL : &*v->begin();
}

7 string转为数组 还是是要注意string为空。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
inline char* string_as_array(std::string* str) {  // DO NOT USE const_cast<char*>(str->data())
  return str->empty() ? NULL : &*str->begin();
}

8 查找关联容器中是否有某个特定的key 没什么好说的,提高效率,函数的参数为const引用类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename Collection, typename Key>bool ContainsKey(const Collection& collection, const Key& key) {  return collection.find(key) != collection.end();
}

9 判断容器是否有序 这里用到了adjacent_find,在一个数组中寻找两个相邻的元素;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename Container>bool STLIsSorted(const Container& cont) {  // Note: Use reverse iterator on container to ensure we only require
  // value_type to implement operator<.
  return std::adjacent_find(cont.rbegin(), cont.rend(),                            std::less<typename Container::value_type>())
      == cont.rend();
}

10 获得两个有序容器的不同 这里用到了DCHECK,是自己定义的宏:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define DCHECK(condition)                                               \
  LAZY_STREAM(LOG_STREAM(DCHECK), DCHECK_IS_ON ? !(condition) : false)  \
  << "Check failed: " #condition ". "
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename ResultType, typename Arg1, typename Arg2>
ResultType STLSetDifference(const Arg1& a1, const Arg2& a2) {
  DCHECK(STLIsSorted(a1));
  DCHECK(STLIsSorted(a2));
  ResultType difference;  std::set_difference(a1.begin(), a1.end(),
                      a2.begin(), a2.end(),                      std::inserter(difference, difference.end()));  return difference;
}

11 合并两个有序的容器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename ResultType, typename Arg1, typename Arg2>
ResultType STLSetUnion(const Arg1& a1, const Arg2& a2) {
  DCHECK(STLIsSorted(a1));
  DCHECK(STLIsSorted(a2));
  ResultType result;  std::set_union(a1.begin(), a1.end(),
                 a2.begin(), a2.end(),                 std::inserter(result, result.end()));  return result;
}

12 同时包含在两个容器中的元素 set_intersection:同时包含第一个和第二个集合中的元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename ResultType, typename Arg1, typename Arg2>
ResultType STLSetIntersection(const Arg1& a1, const Arg2& a2) {
  DCHECK(STLIsSorted(a1));
  DCHECK(STLIsSorted(a2));
  ResultType result;  std::set_intersection(a1.begin(), a1.end(),
                        a2.begin(), a2.end(),                        std::inserter(result, result.end()));  return result;
}

13 判断一个容器是否包含另一个容器的所有内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename Arg1, typename Arg2>bool STLIncludes(const Arg1& a1, const Arg2& a2) {
  DCHECK(STLIsSorted(a1));
  DCHECK(STLIsSorted(a2));  return std::includes(a1.begin(), a1.end(),
                       a2.begin(), a2.end());
}

应用: 对上面介绍的方法进行简单的使用,看看吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>#include<vector>#include<algorithm>#include"stl_util.h"int main()
{  std::vector<int> numbers{1, 2, 3, 4, 6};  std::vector<int> numbers1{ 1, 2, 3 ,4};  std::cout << "Test STLIsSorted:{1, 2, 3, 4, 6}" << std::endl;  std::cout << std::boolalpha <<STLIsSorted(numbers) << std::endl << std::endl;  std::cout << "Test STLSetDifference {1, 2, 3, 4, 6} and { 1, 2, 3 ,4}:" << std::endl;  std::vector<int> difference_result;
  difference_result = STLSetDifference<std::vector<int>, std::vector<int>, std::vector<int>>(numbers, numbers1);  for(auto iter: difference_result)
  {    std::cout << iter << std::endl << std::endl;
  }  std::cout << "Test STLSetIntersection {1, 2, 3, 4, 6} and { 1, 2, 3 ,4}:" << std::endl;  std::vector<int> intersection_result;
  intersection_result = STLSetIntersection<std::vector<int>, std::vector<int>, std::vector<int>>(numbers, numbers1);  for (auto iter : intersection_result)
  {    std::cout << iter << " " ;
  }  std::cout << std::endl;  std::cout << "Test STLIncludes {1, 2, 3, 4, 6} and { 1, 2, 3 ,4}:" << std::endl;  std::cout << std::boolalpha << STLIncludes(numbers, numbers1) << std::endl << std::endl;  std::cout << "Test STLClearObject:" << std::endl;
  STLClearObject(&numbers);  std::cout << "vector size:" << numbers.size() << std::endl;  std::cout << "vector capacity:" << numbers.capacity() << std::endl << std::endl;

  system("pause");  return 0;
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Test STLIsSorted:{1, 2, 3, 4, 6}trueTest STLSetDifference {1, 2, 3, 4, 6} and { 1, 2, 3 ,4}:6Test STLSetIntersection {1, 2, 3, 4, 6} and { 1, 2, 3 ,4}:1 2 3 4Test STLIncludes {1, 2, 3, 4, 6} and { 1, 2, 3 ,4}:trueTest STLClearObject:vector size:0vector capacity:0
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人生有味是多巴胺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2022年,攻击者绕过防火墙的几种方式,及解决方案。
公众号图幻未来
2023/10/09
1K0
网络安全试题——附答案
知孤云出岫
2023/12/11
7860
网络防火墙的结构和原理
防火墙是一种网络安全设备,用于保护内部网络免受外部网络的未经授权访问、攻击和恶意软件的侵害。以下是防火墙的结构和原理的详细解释:
一凡sir
2023/08/28
6120
网络防火墙的结构和原理
2023年新技术和漏洞,如何绕过防火墙的限制的简单梳理
3.物联网(IoT)攻击:随着物联网设备的增加,攻击者可能会利用不安全的IoT设备作为入口,绕过防火墙进入网络。
公众号图幻未来
2023/10/10
5390
网络安全技术:防火墙、VPN、入侵检测基础
防火墙是 网络边界的第一道防线 , 它部署在网络边界上的设备或功能,用来控制网络访问、拦截非法通信。它可以是一个独立设备,也可以内嵌在路由器或操作系统中。
神的孩子都在歌唱
2025/04/11
2510
网络安全技术:防火墙、VPN、入侵检测基础
网络安全设备分类清单
主要介绍当前市面企业中常用的安全设备进行分类,因为个人的接触主要以深信服,天融信,绿盟产品进行分类对比;
全栈工程师修炼指南
2022/09/28
7.7K0
网络安全设备分类清单
防火墙策略管理不当会出现哪些问题
技术限制和性能问题:防火墙策略的管理需要考虑到网络性能和吞吐量的问题,如果策略设置不合理,可能会影响网络的正常运行和性能。 总之,防火墙策略管理中的问题涵盖了策略制定、策略冲突、审查和更新、日志记录、访问控制、员工培训和意识以及技术限制等多个方面。为了确保防火墙的有效运作和网络的安全性,应当定期评估和改进防火墙策略管理的过程。
公众号图幻未来
2023/10/08
4430
防火墙基础
现代的防火墙体系不应该只是-一个“入口的屏障”,防火墙应该是几个网络的接入控制点,所有进出被防火墙保护的网络的数据流都应该首先经过防火墙,形成一个信息进出的关口,因此防火墙不但可以保护内部网络在Internet中的安全,同时可以保护若干主机在一个内部网络中的安全。在每一个被防火墙分割的网络内部中,所有的计算机之间是被认为“可信任的”,它们之间的通信不受防火墙的干涉。而在各个被防火墙分割的网络之间,必须按照防火墙规定的“策略”进行访问。
全栈程序员站长
2022/06/29
1.6K0
防火墙基础
防火墙、IDS、IPS之间有什么区别?
1、基础防火墙类:主要是可实现基本包过滤策略的防火墙,这类是有硬件处理、软件处理等,其主要功能实现是限制对IP:port的访问。基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略。
网络安全观
2021/02/25
5.7K0
防火墙、IDS、IPS之间有什么区别?
网络安全第四讲 防火墙工作原理及应用
网络信息安全第四讲 防火墙工作原理及应用 一 防火墙概念与分类 1.防火墙简介 防火墙允许授权的数据通过,而拒绝未经授权的数据通信。网络防火墙是隔离内部网与Internet之间的一道防御系统,允许人们在内部网和开放的Internet之间通信。访问者必须首先穿越防火墙的安全防线,才能接触目标计算机。 在没有防火墙时,局域网内部的每个节点都暴露给Internet上的其它主机,此时内部网的安全性要由每个节点的坚固程度来决定,且安全性等同于其中最薄弱的节点。使用防火墙后,防火墙会将内部网的安全性统一到它自身,网络安
易兮科技
2020/10/28
6.4K0
网络安全第四讲 防火墙工作原理及应用
2024年护网行动全国各地面试题汇总(1)作者:————LJS
盛透侧视攻城狮
2024/10/21
2610
VPN、防火墙等正在被黑客「爆雷」
曾几何时,防火墙、VPN网关等安全服务被人们广泛视为安全性的「坚固堡垒」,其地位近乎于不可撼动的安全象征。然而,现实却揭示了一个不容忽视的真相:这些服务远非能够百分之百地保障设备安全无虞。相反这些安全服务自身的同样潜藏着诸多安全漏洞。这些曾经被忽视的边缘服务如同一颗颗深埋地下的「雷」,如今这些「雷」正在被黑客一一引爆。
FB客服
2024/07/22
4700
VPN、防火墙等正在被黑客「爆雷」
2024年护网行动全国各地面试题汇总(4)作者:————LJS
盛透侧视攻城狮
2025/06/15
1230
攻击者隐藏踪迹的5种方式
从受信任的渗透测试工具到LOLBIN(living-off-the-land binaries),攻击者正在通过滥用受信任的平台和协议来逃避安全检测。
FB客服
2021/07/02
9150
linux世界中的10大经典病毒全分析
今天波哥收集整理了linux世界中的10大病毒的特点及影响。Linux系统由于其高度的安全性和开源特性,比起Windows和其他操作系统,病毒和恶意软件的感染案例要少得多。然而,这并不意味着Linux系统就是完全安全的,它们也可能受到攻击。以下是一些曾影响Linux系统的恶意软件以及它们的概述和危害:
IT运维技术圈
2024/02/06
7260
linux世界中的10大经典病毒全分析
100 个网络安全基础知识
网络安全是指采取必要措施,防范对网络的攻击、侵入、干扰、破坏和非法使用以及意外事故,使网络处于稳定可靠运行的状态,保障网络数据的完整性、保密性、可用性。(参考《中华人民共和国网络安全法》)
ICT系统集成阿祥
2025/04/14
5040
100 个网络安全基础知识
ATT&CK视角下的红蓝对抗:一. 隧道穿透技术详解
从技术层面来讲,隧道是一种通过互联网的基础设施在网络之间传递数据的方式,其中包括数据封装、传输和解包在内的全过程,使用隧道传递的数据(或负载)可以使用不同协议的数据帧或包。
一只特立独行的兔先生
2023/10/29
1.6K1
ATT&CK视角下的红蓝对抗:一. 隧道穿透技术详解
【云安全最佳实践】云防火墙和Web应用防火墙的区别
随着互联网的进一步发展,Web应用防火墙和云防火墙步入大家的视野。防火墙针对web应用拥有很好的保护作用,由硬件和软件组合,在内部网和外部网、专用网和公共网之间形成一道强有力的保护屏障,使用者可配置不同保护级别的防火墙,高级别的保护会阻止运营一些服务。众所周知,防火墙是一种建立在现代通信网络技术和信息安全技术基础上的应用性安全技术、隔离技术,用来加固网络保障网络安全的。那么,我们如何理解这两种防火墙,他们有什么区别?
芯动大师
2022/10/09
5.6K0
IT知识百科:什么是下一代防火墙?
在信息技术的世界里,安全始终是最重要的考虑因素之一。一个关键的安全组件是防火墙,这是一种网络安全系统,设计用来阻止未经授权的访问。然而,随着技术的发展和网络威胁的增多,传统的防火墙已经不能满足现代网络环境的需求。下一代防火墙(Next-Generation Firewall,NGFW)作为一种新型的安全解决方案,正在改变我们对网络安全的理解。
网络技术联盟站
2023/09/24
1.3K0
IT知识百科:什么是下一代防火墙?
计算机网络中的防火墙基础
防火墙是一种基于硬件或软件的网络安全设备,它监视所有传入和传出流量,并根据一组定义的安全规则接受、拒绝或丢弃特定流量。
用户1418987
2023/11/21
3910
计算机网络中的防火墙基础
推荐阅读
相关推荐
2022年,攻击者绕过防火墙的几种方式,及解决方案。
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验