发布一个stl标准库容器类(vector/list)的安全删除方法
话不多说,看代码。
#include <functional>
#ifndef ASSERT
#include <cassert>
#define ASSERT assert
#endif
/**
* 释放对象列表
* @param items 对象列表
* @return
*/
template<typename array>
void zero_array(array& items)
{
ASSERT(!items.empty());
if (!items.empty())
{
for (auto iter = items.begin(); iter != items.end();)
{
typename array::value_type& item_ptr = *iter;
destory<typename array::value_type>::delete_data(item_ptr);
iter = items.erase(iter);
}
}
}
/**
* 释放对象列表
* @param items 对象列表 deleter 删除器
* @return
*/
template<typename array>
void zero_array(array& items, std::function<void(typename array::value_type&)> deleter)
{
ASSERT(!items.empty());
if (!items.empty())
{
for (auto iter = items.begin(); iter != items.end();)
{
typename array::value_type& item_ptr = *iter;
deleter(item_ptr);
iter = items.erase(iter);
}
}
}
/**
* 删除器
*/
template<typename T>
struct destory
{ inline static void delete_data(T&) { } };
/**
* 删除器特化版本
*/
template<typename T>
struct destory <T*>
{ inline static void delete_data(T*& _ptr) { delete _ptr; _ptr = nullptr; } };
代码很简单,调用也简单,比如:
struct tag_a
{
int id;
int age;
};
vector<tag_a*> a_items;
zero_array(a_items);
或者
vector<tag_a> a_items;
zero_array(a_items);
模板内部已经做过类型自动匹配,所以不论是堆类型还是栈类型都可以安全的删除。
发布一个stl标准库容器类(vector/list)的安全删除方法的更多相关文章
- STL标准库-容器-vector
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 向量容器vector是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector ...
- C++ Primer 第三章 标准库类型vector+迭代器iterator 运算
1.vector: 标准库类型vector表示对象的集合,其中所有对象的类型都相同,集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它也常被称作容器( ...
- STL标准库-容器-deque
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去 deque却可以,它创造了内存 ...
- 标准库类型vector
标准库类型vector表示对象的集合,其中所有对象的类型都相同.集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它被称为容器. 要想使用vector, ...
- C++ Primer笔记1_转义字符_标准库类型string_标准库类型vector
1.转义字符 一般有两种方式: \x后紧跟1个或多个十六进制数字.或\后紧跟1.2.3个八进制数字,当中数字部分是字符相应的数值. #include <iostream> using na ...
- STL标准库-算法-常用算法
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each( ...
- STL标准库-容器-set与multiset
技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key se ...
- C++STL标准库学习笔记(五)set
前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,这一篇后面主要都是我的记录了,为了防止大片蓝色字体出现,后面就不改蓝色 ...
- C++STL标准库学习笔记(三)multiset
C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...
随机推荐
- 用NPOI、C#操作Excel表格生成班级成绩单
在C#中利用NPOI操作Excel表格非常方便,几乎上支持所有的Excel表格本身所有的功能,如字体设置.颜色设置.单元格合并.数值计算.页眉页脚等等. 这里准备使用NPOI生成一个班级成绩单Exce ...
- Fedora Core 11 Alpha试用视频(由于youtube问题暂时无法访问)
1.系统安装: http://www.youtube.com/watch?v=QcDy5eRQZ20 2.重启后配置 3.体验Fedora 11 Gnome2.25和Kde 4.2 http: ...
- 网站平台的favicon.ico的logo
<link rel="shortcut icon" href="http://www.uuop.com/icotemp/2017061703035984/f ...
- dp水题
hdu 2084: #include <stdio.h> #include <iostream> #include <string.h> using namespa ...
- Java-Spring-WebService最基础的配置示例
很早很早之前,就初步学习了WebService,感觉还是比较"好"的. 使用Web服务,感觉就像普通API一样,和HTTP接口比较起来. WebService有个很大的局限,就 ...
- gSOAP 使用WebServer心得
关于正常怎么使用gSOAP的话,下面那篇博客已经讲得非常详细,我就不再赘述了 https://www.cnblogs.com/dengpeng1004/p/6165751.html 问题1: WCF ...
- 下载编译 Android wear 源代码,尝试制作可穿戴设备功能
体验 Android Wear 缘由: Android wear 代码公布已经非常久了.一直没有尝试,这里是个编译的过程和步骤,假设要尝试.本文假定读者已经有下载编译 Android 的经验,假设没 ...
- Bitmap Image Graphics
Bitmap Image Graphics private void DrawImagePointF(PaintEventArgs e){ // Create image. Image new ...
- BZOJ3697: 采药人的路径(点分治)
Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材.采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的.采药人每天都要进行采药活动 ...
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
原博客地址:http://blog.csdn.net/xyz_lmn/article/details/8057270 最近,项目中需要用到短网址(ShortUrl)的算法,于是在网上搜索一番,发现有C ...