stl学习记录(1)

Effective STL 中文版学习记录

条款4 判断容器是否为空 使用empty而不是size().size()操作在实现上不是一个时间常数操作条款5 尽量使用区间成员函数代替它们的单元素兄弟.STL实现中,区间范围显示比单个循环操作更优化

条款7:当使用new得指针的容器时,记得在销毁容器前delete那些指针
vc2008下 运行代码 可以看到 该程序内存不断增加
// 1111111.cpp : 定义控制台应用程序的入口点。
//

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "stdafx.h"
#include <vector>
#include <windows.h>
 
using namespace std;
 
void DoSomethingV1()
{
vector<int*> pivec; //创建一个int指针的容器
for(int i = 0; i < 9;++i)
{
int* p = new(int);
*p = i;
pivec.push_back(p);
}
//  函数结束时候 容器在生存域外 则销毁
//  但是指针指向内容未销毁 内存泄露
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
while(1)
{
Sleep(1);
DoSomethingV1();
}
return 0;
}

  

我们可以使用在某个使用完容器后的环节自行循环删除指针内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void DoSomethingV2()
{
vector<int*> pivec; //创建一个int指针的容器
for(int i = 0; i < 9;++i)
{
int* p = new(int);
*p = i;
pivec.push_back(p);
}
//  函数结束时候 销毁指针内容
for (vector<int*>::iterator i = pivec.begin();
i != pivec.end();
++i) {
delete *i;
}
}

  

但是这个代码不是异常安全的

还有个解决办法就是 使用智能指针 BOOST的shared_ptr

  

 

 

条款8:永不建立auto_ptr的容器
auto_ptr似乎已经在C++ 11 中废弃

 

 

条款8:永不建立auto_ptr的容器
auto_ptr似乎已经在C++ 11 中废弃

条款9:在删除选项中仔细选择
不同的容器使用不同的方法
连续内存容器(vector、deque或string) 使用erase-remove惯用
c.erase(remove(c.begin(), c.end(), 22),c.end());

list容器仅仅使用remove方法
c.erase(2);

另外 如果在容器遍历循环中使用了erase。由于该方法的实现,必须根据是否进行擦除erase来区别处理遍历的迭代器

for (SeqContainer<int>::iterator i = c.begin(); i != c.end();)
{
if (badValue(*i))
{
cerr<< "Erasing " << *i << '\n';
i = c.erase(i); // 通过把erase的返回值
} // 赋给i来保持i有效
else
++i;
}

posted on   itdef  阅读(266)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示