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. VS Supercharger插件

    一.前言 Supercharger 是 VS 的一款插件,针对代码进行优化和着色,便于观察和区分. 二.下载及安装 下载的 URL 如下:Supercharger 下载地址 点击下载,下载完成以后,那 ...

  2. Swift3.0 键盘高度监听获取

    方法:通过通知监听键盘的动态 1.键盘的动态有四种: public static let UIKeyboardWillShow: NSNotification.Name public static l ...

  3. html扩展调用qq邮箱

    总体流程:qq邮箱->设置->账户->邮我(使用邮我) over!over!over!

  4. laravel 安装配置前准备

    Laravel 框架使用 Composer 来管理其依赖性.所以,在你使用 Laravel 之前,你必须在你电脑上是否安装了 Composer.最简单的获取Composer的方式就是百度之,百度关键字 ...

  5. 基于ndk_r7_windows编译实现ndk项目,不需要cygwin

    下面就介绍下Android NDK的入门学习过程: 入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的. 一. ...

  6. bzoj3453: tyvj 1858 XLkxc(拉格朗日插值)

    传送门 \(f(n)=\sum_{i=1}^ni^k\),这是自然数幂次和,是一个以\(n\)为自变量的\(k+1\)次多项式 \(g(n)=\sum_{i=1}^nf(i)\),因为这东西差分之后是 ...

  7. [Xcode 实际操作]七、文件与数据-(19)颜色集(Color Set)的使用

    目录:[Swift]Xcode实际操作 本文将演示颜色集合的使用. 使用颜色集合可以很方便地创建应用程序的主题色,并且可以方便的对主题颜色进行更换. 要使用颜色集功能,需要设置项目的部署(Deploy ...

  8. mybatis-trim标签说明

    trim标签使用1.trim 有四个属性 2.prefix,suffix 表示在trim标签包裹的部分的前面或者后面添加内容(注意:是没有prefixOverrides,suffixOverrides ...

  9. redis开发小结

    随着缓存在web服务中用的越来越广泛,redis可以说成为了目前最流行的NoSQL数据库!redis与memcached最大的不同在于redis支持更多的数据类型,包括string.hash.list ...

  10. 洛谷 P1067 多项式输出

    P1067 多项式输出 模拟,很坑的那种 var i,n:longint; a:array[1..105] of integer; begin readln(n); for i:=1 to n+1 d ...