Category Archives: C && C++

论如在C++中何用正确的姿势边迭代、边删除reverse_iterator

在C++的容器中,我们可以边迭代边删除,如下:

但是,有时候,我们希望使用reverse_iterator也做这个工作:边迭代、边删除:

这个有有点麻烦了,首先要都用rbegin、rend。。其次,erase的时候有点trick,如下:

或者:

看着很不科学是吧?–和++居然都行?[……]

继续阅读

C++中,解析UTF-8字符的位置。

在C++的char*以及string中,使用的是字节流编码,即sizeof(char) == 1。

也就是说,C++是不去分字符的编码的。

而一个合法UTF8的字符长度可能为1~4位。

现在假设一串输入为UTF8编码,如何能准确的定位到每个UTF8字符的“CharPoint”,而不会错误的分割字符呢?

参考这个页面:http://www.nubaria.com/en/blog/?p=289

可以改造出下面的函数:
[crayon-5a1129da66af74764[……]

继续阅读

c++ tr1和Boost中,tuple、tie的用法。

在c++ 98标准的STL中,只有一个pair<T1, T2>可以容纳两个不同的类型。

我们知道在Python中,有一种tuple,可以把任意多类型的不同数据组成一组tuple,如今的tr1标准,也支持这种数据结构啦!!
Boost中的tuple
这个是从Boost中完全采纳的,所以先看Boost用法:

声明:

获取tuple的第几个元素:
[crayon-5a1129da66c349415165[……]

继续阅读

C++ Boost/tr1 Regex(正则表达式)快速指南

正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分。

本文以Boost 1.39正则表达式为基础,应该广泛适用于其他版本的Boost。对namespace稍加修改,即可适用tr1标准。
0、regex对象
类似于Java中的Pattern,Boost中的正则表达式对象为:

boost::regex

常见构造方法2种:

1、regex_match
首先要明确match和sea[……]

继续阅读

C++ Boost智能指针(smart_ptr)快速指南

智能指针(smart_ptr)是Boost各组件中,应用最为广泛的一个。

重所周知,C++没有提供Java中的垃圾回收机制。因此,在堆上申请的内存,需要自行回收,这就很容易导致内存泄漏。虽然STL提供了auto_ptr,但是受限太多(例如,不能放到容器中。。。),因此很少有人使用。

Boost从很早就提供了如下的智能指针,并且功能一直保持稳定:

  • scoped_ptr:不可拷贝,承载new。
  • scoped_array:不可拷贝,承载new []。
  • shared_ptr:[……]

继续阅读