您的位置:首页 > 大数据 > 人工智能

stl源码简析char_traits.h

2017-03-28 08:56 274 查看

stl源码简析char_traits.h

掠过之前不重要的东西,直接上代码了

static void assign(char_type& __c1, const char_type& __c2) { __c1 = __c2; }
static bool eq(const _CharT& __c1, const _CharT& __c2)
{ return __c1 == __c2; }
static bool lt(const _CharT& __c1, const _CharT& __c2)
{ return __c1 < __c2; }


这 三个函数很简单

第一个是字符赋值

第二个比较是否相等

第三个比较是否小于

我们继续往下看

static int compare(const _CharT* __s1, const _CharT* __s2, size_t __n) {
for (size_t __i = 0; __i < __n; ++__i)
if (!eq(__s1[__i], __s2[__i]))
return __s1[__i] < __s2[__i] ? -1 : 1;
return 0;
}


这就是比较字符串是否相等的函数,相等返回0,大于返回1,小于返回-1

怎么样是不是很简单,自己都可以写出来

再看一下length函数

static size_t length(const _CharT* __s) {
const _CharT __nullchar = _CharT();
size_t __i;
for (__i = 0; !eq(__s[__i], __nullchar); ++__i)
{}
return __i;
}


这里注意了,返回长度的时候并不是你字符串长度为多少就给你返回多少,比如

char a[5]="abcdefgh";


当你调用length函数的时候是从a[0]的位置开始一直找到‘\0’才结束

所以length(a)=8而并不是我们想象中的5

static const _CharT* find(const _CharT* __s, size_t __n, const _CharT& __c)
{
for ( ; __n > 0 ; ++__s, --__n)
if (eq(*__s, __c))
return __s;
return 0;
}


查找特定字符的函数,也很简单遍历一次,这里就不再赘述

继续往下

static _CharT* move(_CharT* __s1, const _CharT* __s2, size_t __n) {
memmove(__s1, __s2, __n * sizeof(_CharT));
return __s1;
}

static _CharT* copy(_CharT* __s1, const _CharT* __s2, size_t __n) {
memcpy(__s1, __s2, __n * sizeof(_CharT));
return __s1;
}

static _CharT* assign(_CharT* __s, size_t __n, _CharT __c) {
for (size_t __i = 0; __i < __n; ++__i)
__s[__i] = __c;
return __s;
}


看函数名就可以知道它们的具体功能,这里也没什么需要注意的地方,也不多讲了

static char_type to_char_type(const int_type& __c) {
return static_cast<char_type>(static_cast<unsigned char>(__c));
}

static int_type to_int_type(const char_type& __c) {
return static_cast<unsigned char>(__c);
}


函数功能参考函数名,这里的转换就是这么简单粗暴

最后一部分

static int compare(const char* __s1, const char* __s2, size_t __n)
{ return memcmp(__s1, __s2, __n); }

static size_t length(const char* __s) { return strlen(__s); }

static void assign(char& __c1, const char& __c2) { __c1 = __c2; }

static char* assign(char* __s, size_t __n, char __c)
{ memset(__s, __c, __n); return __s; }


在另一个模板类里面又有一个compare函数 不过实现方式不太一样,这个是直接调用memcmp函数

到这里这部分的源码就看完了,怎么样,其实也还是很简单的。大家可以多看看源码,不仅可以学到很多新姿势,对自己的帮助也很大
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stl 源码