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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <vector> #include <windows.h> #include <boost/smart_ptr.hpp> using namespace std; void DoSomethingV3() { typedef boost::shared_ptr< int > SPI; //SPi = "shared_ptr vector<SPI> vspi; for ( int i = 0; i < 9;++i) { vspi.push_back(SPI ( new int (i)) ); } } |
条款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;
}
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话