0
点赞
收藏
分享

微信扫一扫

[C++] std::string探幽

做个橙梦 2022-01-30 阅读 68

目录

1.前言

2.成员变量

3.成员函数

4. 参考


 

1.前言

在C++标准库中,用得最多的应该是std::string类,人们经常使用它,却很少人去研究他的实现,也许要用它某个方法时才去搜索,那么如果程序员对string有深入的了解,可以更有掌控感。

众所周知,类是由成员变量和成员函数组成,即属性和行为,那么我将从这两个方面来解析string。

2.成员变量

有13个成员变量+1个静态变量,静态变量npos是存储此类最大长度的。

string实际存储的是char型的数据。

member typedefinition
value_typechar
traits_typechar_traits<char>
allocator_typeallocator<char>
referencechar&
const_referenceconst char&
pointerchar*
const_pointerconst char*
iteratora random access iterator to char (convertible to const_iterator)
const_iteratora random access iterator to const char
reverse_iteratorreverse_iterator<iterator>
const_reverse_iteratorreverse_iterator<const_iterator>
difference_typeptrdiff_t
size_type

size_t

 

3.成员函数

不算重载有51个函数,具体查看点击以下链接http://www.cplusplus.com/reference/string/string/?kw=stringicon-default.png?t=M0H8http://www.cplusplus.com/reference/string/string/?kw=string

接下来对其中的一些进行分析:

A. 其中size()和length()都可以获取长度,那么哪个是对的呢?

经过我查看源码,发现这两个函数的代码一样,所以用得时候当作同一个函数就行了。

    _NODISCARD _CONSTEXPR20_CONTAINER size_type length() const noexcept {
        return _Mypair._Myval2._Mysize;
    }

    _NODISCARD _CONSTEXPR20_CONTAINER size_type size() const noexcept {
        return _Mypair._Myval2._Mysize;
    }

 我有一个想法,为啥不直接用size来调用length,或者反之,是为了减少函数堆栈吗?

B. std::string的内部类型是什么?

经过查看源代码有这样一段

using string  = basic_string<char, char_traits<char>, allocator<char>>;

也就是说上面这两边是相等的。可以看到是一个模板类,里面为char型。

C. 存储中文有问题吗?

	std::string txt1 = "hello";
	std::string txt2 = "你好世界";

txt1.length()返回5,正确。

txt2.length()返回8,明显不正确,因为string是以字符存的,不在乎编码;

我在windows平台下,应该是GBK,GBK用两个字节来代表一个中文,所以"你好世界"长度为8。如果使用wstring可以解决这样的问题。

4. 参考

举报

相关推荐

0 条评论