CPP-STL:STL备忘
STL备忘(转)
1. string.empty() 不是用来清空字符串,而是判断string是否为空,清空使用string.clear();
2. string.find等查找的结果要和string::npos比较,而不是和-1比较。(各个平台可能不同)
3. 将string转为char * ,用char * t = (char *)s.c_str() ,而不是 char *t =s.begin() 或者 char *t = &s[0] 或者 char *t =s.data();
4. 不要用错string.find ,string::find_first_of ,find和find_first_of有本质区别
find是查找子串在string出现的位置
find_first_of是查找第一个匹配目标字符串任何一个字符出现的位置。
(大多数的时候,需要的是find)
5. 用swap技巧来移去string(vector)多余的空间
vector<int> v ;
...
vector<int>(v).swap(v);
6. 用vector<char>来储存二进制流
7. 了解各种储存bool的优缺点
vector<bool> 第一,它不是一个真正STL容器,第二,它并不保存bool类(Effective STL 18条)
deque<bool> 不连续
vector<char> 太浪费
bitset 不能动态增长
boost::dynamic_bitset 不是标准
8. vector resize()和reserve()分别和size和capacity对应,不要搞错
9. vector 的at方法会进行边界检查,[]操作符则不会
10. 使用iterator的时候,自增或者自减,多使用++iter ,--iter的格式。
11. std::mem_fun/std::mem_fun_ref可以将成员函数用来for_each等方法。
std::vector<Employee> emps;
std::for_each(emps.begin(), emps.end(),
std::mem_fun_ref(&Employee::DoStandardRaise); std::vector<Employee*> emp_ptrs;
std::for_each(emp_ptrs.begin(), emp_ptrs.end(),
std::mem_fun(&Employee::DoStandardRaise));
12. 如何删除?
vector:
vector<int> v;
v.erase(remove(v.begin(), v.end(), ), v.end()); list:
list<int> li;
li.remove();
13. 尽量用成员函数代替同名的算法
14. 循环中删除map元素的写法
typedef map<int,int> mymap;
typedef map<int,int>::iterator myiter;
mymap m; m[] = ; m[] = -; m[] = ; m[] = ; m[] = -; m[] = ;
myiter iter = m.begin(); while(iter!=m.end()) {
if(iter->second<)
m.erase(iter++);
else
++iter;
}
15. 从ifstream读出一行到string,使用std::getline(ifstream的成员函数getline做不到)
16.警惕string的引用记数技术实现带来的潜在问题
string greet("Hello, world");
string hi(greet);
char *ptr = (char *)hi.c_str();
ptr[] = 'h';
//两个字符串都被修改。
在多线程之间引用多个有关系的string,可能导致引用计数失效,造成多次删除,或者memory leak.
保险的做法是:
string s1("hello") ; string s2 (s1.c_str()); //force copy
17.自定义类放入stl容器中,应注意实现安全的copy ctor和assign operator.尤其是含有指针的class,避免多次删除
18.避免iterator失效,不提取无效的iterator
比如:
vector<int> iv;
vector<int>::iterator end = iv .end();
for(int i=;i<;++i)
iv.insert(end,i);
会crash ,因为end指针,随着insert后可能失效
改为:
vector<int> iv;
for(int i=;i<;++i)
iv.insert(iv.end(),i);
或者:
vector<int> iv;
for(int i=;i<;++i)
iv.push_back(i); //prefer
19. 不要把std::auto_ptr用于数组指针
auto_ptr<int> p(new int[]); //maybe cause memory leak
20. 不要直接修改set,map的键值,如果要修改,先erase,再insert.
21. 多线程下,几个线程如果共同操作一个容器,安全性(锁)应该由用户自己来实现,stl不保证这一点
例如,一个多线程安全的deque
template<typename T,class ThreadModel=MultiThread>
class CDequePool:private ThreadModel {
private:
std::deque<T> m_clDeque;
//.....
public:
bool PutData(const T &data)
{
Lock();
m_clDeque.push_front(data);
Unlock();
return true;
}
//....
}
CPP-STL:STL备忘的更多相关文章
- C++ STL (备忘)
2014-08-04 16:33:57 (1) map map定义形式 map<type1,type2> map_name; map的基本操作函数: C++ Maps是一种关 ...
- STL备忘
STL备忘 lower_bound 查找第一个大于或等于的数,返回该数字的地址,地址减去首地址即得到数组下标(首地址下标为0) upper_bound 查找第一个大于的数 unique 去重,常用于离 ...
- MFC通过txt查找文件并进行复制-备忘
MFC基于对话框的Demo txt中每行一个23位的卡号. 文件夹中包含以卡号命名的图像文件.(fpt或者bmp文件) 要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来. VC6.0写的. ...
- 代码文档生成工具Doxygen的使用备忘
Doxygen备忘 下载与安装 一般步骤 生成配置文件Doxyfile: doxygen (-s) -g 建立目录结构, 比如Doxyfile文件\doc文件夹(输出)\src文件夹(放代码) -&g ...
- 代码备忘, TODO宏实现
代码备忘, TODO宏实现 我们平时在开发过程中, 往往并非憋足气一股脑敲完所有代码.每一个模块, 每一个函数的实现总有个先后顺序. 又或者哪个部分须要做调整, 改动- 所以, 我们须要有一个东西, ...
- opencv-2.4.11编译备忘
编译完成后,想测试example中例子,但是由于没有sudo权限,不能运行pkg-config查看opencv的--cflags和--libs. 记录一下,备忘: pkg-config --libs ...
- GIS部分理论知识备忘随笔
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- Vi命令备忘
备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...
随机推荐
- XSL简单实例
利用xsl可以做到将数据和格式完全分离,下面比较一个xml+css和xml+xsl的区别. XML + css resume.xml文件内容如下: <?xml version="1.0 ...
- 51nod - 1420 - 数袋鼠好有趣 - 贪心 - 二分
https://www.51nod.com/Challenge/Problem.html#!#problemId=1420 一开始乱搞了一发,每个袋鼠二分找最小的能放它的,然后二分的范围从下一个开始保 ...
- Untiy一些方法前特殊标签记录
[ExecuteInEditMode] // Make code live-update even when not in play mode [ContextMenu("Execute&q ...
- poj2133(sg函数)
关于sg函数:http://www.cnblogs.com/Knuth/archive/2009/09/05/1561007.html 题目链接:http://poj.org/problem?id=2 ...
- 洛谷P3292 [SCOI2016]幸运数字(倍增+线性基)
传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 第一眼:这不会是个倍增LCA暴力合并线性基吧…… 打了一发……A了? 所以这真的是个暴力倍增LCA合并线性基么…… ps:据某大佬说其实可以离线之后 ...
- Java 定时任务(转)
转自 http://www.cnblogs.com/chenssy/p/3788407.html 在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer ...
- hard(2018.10.18)
题意:给你一棵\(n\)个节点的树,\(q\)个询问,每次询问读入\(u,v,k,op\),需要满足树上有\(k\)对点的简单路径交都等于\(u,v\)之间的简单路径,\(op=1\)表示\(k\)对 ...
- wordcloud 的常规方法
wordcloud 库把词云当作一个WordCloud对象 ——wordcloud.WordCloud() 代表一个文本对应的词云 ——可以根据文本中词语出现的频率等参数绘制词云 ——绘制词云的形状. ...
- Zynq7000开发系列-2(VMware与Ubuntu安装使用)
一.前言 在嵌入式开发中,是无法避免使用Linux系统的,因为在开发之前必须先搭建起交叉编译环境,而后关于Bootloader.Linux Kernel的裁剪移植,File system的制作,底层驱 ...
- 大数加法 HDU 1002
#include <iostream> #include <cstring> #include <string> #include <cstdio> # ...