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源码学习——迭代器(iterators)与traits编程技法
- STL源码解析(2) -- 迭代器iterator与traits
- STL源码分析--萃取编程(traits)技术的实现
- STL源码分析之RB-tree结构简析
- STL源码解析——traits(特性)编程技巧
- STL源码分析之__type_traits
- STL源码分析《4》----Traits技术
- STL源码-iterator traits编程技法
- STL源码分析《4》----Traits技术
- STL源码-iterator traits编程技法(续)
- STL_源码剖析之三:迭代器与traits
- STL源码-iterator traits编程技法
- STL源码-iterator traits编程技法(续)
- STL源码-traits的使用
- STL 源码剖析读书笔记二:迭代器与traits
- STL源码分析读书笔记--第三章--迭代器(iterator)概念与traits编程技法
- linux mtd源码分析--mtdchar.c
- DM9000&nbsp;驱动移植及源码简析
- STL源码--alloc
- STL源码分析 # vector #