stl源码简析char_traits.h

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(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,源码)