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备忘的更多相关文章

  1. C++ STL (备忘)

    2014-08-04 16:33:57 (1)  map  map定义形式 map<type1,type2> map_name; map的基本操作函数:      C++ Maps是一种关 ...

  2. STL备忘

    STL备忘 lower_bound 查找第一个大于或等于的数,返回该数字的地址,地址减去首地址即得到数组下标(首地址下标为0) upper_bound 查找第一个大于的数 unique 去重,常用于离 ...

  3. MFC通过txt查找文件并进行复制-备忘

    MFC基于对话框的Demo txt中每行一个23位的卡号. 文件夹中包含以卡号命名的图像文件.(fpt或者bmp文件) 要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来. VC6.0写的. ...

  4. 代码文档生成工具Doxygen的使用备忘

    Doxygen备忘 下载与安装 一般步骤 生成配置文件Doxyfile: doxygen (-s) -g 建立目录结构, 比如Doxyfile文件\doc文件夹(输出)\src文件夹(放代码) -&g ...

  5. 代码备忘, TODO宏实现

    代码备忘, TODO宏实现 我们平时在开发过程中, 往往并非憋足气一股脑敲完所有代码.每一个模块, 每一个函数的实现总有个先后顺序. 又或者哪个部分须要做调整, 改动- 所以, 我们须要有一个东西, ...

  6. opencv-2.4.11编译备忘

    编译完成后,想测试example中例子,但是由于没有sudo权限,不能运行pkg-config查看opencv的--cflags和--libs. 记录一下,备忘: pkg-config --libs ...

  7. GIS部分理论知识备忘随笔

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...

  8. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  9. Vi命令备忘

    备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...

随机推荐

  1. 在ANGULAR6中使用Echarts的正确方式之一

    这里的正确指的是不会在运行过程中报错,不会再prod模式下编译报错,不会再AOT模式下编译报错 个人环境说明: { "name": "angular-for-echart ...

  2. js 点击往div里添加图片(实例)

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  3. 洛谷P4238 【模板】多项式求逆(NTT)

    传送门 学习了一下大佬的->这里 已知多项式$A(x)$,若存在$A(x)B(x)\equiv 1\pmod{x^n}$ 则称$B(x)$为$A(x)$在模$x^n$下的逆元,记做$A^{-1} ...

  4. mysql之SQL入门与提升(一)

    一.基本的增删改查 1.1首先建一张表 DROP TABLE IF EXISTS `websites`;CREATE TABLE `websites` ( `id` int(11) NOT NULL ...

  5. Hackintosh

    条件:Mac环境(也可在Windows电脑上用虚拟机建立).两只(一只亦可)16G及以上优盘.一块64G以上SSD固态(机械)硬盘.一台待折腾的Windows电脑 1.创建安装盘: ·app stor ...

  6. boot接入elasticsearch

    boot接入elasticsearch 参考博客:https://blog.csdn.net/li521wang/article/details/83792552 项目源码demo:https://g ...

  7. Mybatis思

    站在巨人的肩膀上,感谢! mybatis源码分析之Mapper代理实现分析 2017年11月21日 23:39:04 huangshanchun 阅读数:277    版权声明:欢迎转载,如有不足之处 ...

  8. 002-tomcat安装与配置

    1.创建目录 [root@bogon tomcat]#mkdir /usr/local/java/tomcat 2.上传压缩包并解压 [root@bogon tomcat]# tar xvf apac ...

  9. swap(2018.10.16)

    题意:给定一个{0,1,2,3,-,n-1}的排列 p. 一个{0,1,2 ,-,n-2}的排列 q 被认为是优美的排列, 当且仅当 q 满足下列条件 对排列 s={0,1,2,3,...,n-1}进 ...

  10. github 收藏项目的方法

    1,Watching 需要收藏的项目 2,查看收藏的项目