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:命令模式下保存当前文件所 ...
随机推荐
- supervisor简明教程
一.supervisor是什么 Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态 ...
- tinyxml一些应注意的问题
今天在对使用tinyxml库的程序调试的时候,出现的一些问题让人很纠结,特记以此... 在对TixmlDocument创建时我是用new创建的,然后在用完之后我用delete释放掉,可是用gdb调试 ...
- python 函数 之 用户注册register()
db_path='db.txt' #定义默认文件路径,方便修改def get_uname(): while True: uname=input('请输入用户名:').strip() if uname. ...
- 区间质数查询 luoguP1865
原题 https://www.luogu.org/problemnew/show/P1865 本来get到了一个很好的判断素数的方法 O(玄学常数)https://www.luogu.org/blog ...
- Mybatis中分页存在的坑1
站在巨人的肩膀上 https://www.cnblogs.com/esileme/p/7565184.html 环境:Spring 4.2.1 Mybatis 3.2.8 pagehelper 5.1 ...
- 单片机的C语言中位操作用法
在对单处机进行编程的过程中,对位的操作是经常遇到的.C51对位的操控能力是非常强大的.从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点.这也是在各个领域中都可以看到C的重要 ...
- 初入Three.js 第一章
一.什么是WebGL? 1.WebGL是在浏览器中实现三维效果的一套规范. 二.什么是threejs? 1.你将它理解成three + js就可以了.three表示3D的意思,js表示javascri ...
- [题解](折半搜索/高斯消元枚举自由元)BZOJ_1770_Lights
状压,时间空间都不行,如果每次搜索一半就可以省下很多空间,用map记下每种状态的答案,最后再把两次的答案合并 然而正解是高斯消元解异或方程组,最后搜索自由元 #include<iostream& ...
- 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...
- 改变滚动条的原始样式: chrome 可以改变, IE只能变相关颜色,firfox好像也不好改。最好是自己写一个或是用插件
相关作者链接地址: https://www.lyblog.net/detail/314.html 问题: 1.我在项目中遇到的问题: 在设置了::-webkit-scrollbar 后,滚动条不见了! ...