目录
1.前言
在C++标准库中,用得最多的应该是std::string类,人们经常使用它,却很少人去研究他的实现,也许要用它某个方法时才去搜索,那么如果程序员对string有深入的了解,可以更有掌控感。
众所周知,类是由成员变量和成员函数组成,即属性和行为,那么我将从这两个方面来解析string。
2.成员变量
有13个成员变量+1个静态变量,静态变量npos是存储此类最大长度的。
string实际存储的是char型的数据。
member type | definition |
---|---|
value_type | char |
traits_type | char_traits<char> |
allocator_type | allocator<char> |
reference | char& |
const_reference | const char& |
pointer | char* |
const_pointer | const char* |
iterator | a random access iterator to char (convertible to const_iterator) |
const_iterator | a random access iterator to const char |
reverse_iterator | reverse_iterator<iterator> |
const_reverse_iterator | reverse_iterator<const_iterator> |
difference_type | ptrdiff_t |
size_type | size_t |
3.成员函数
不算重载有51个函数,具体查看点击以下链接http://www.cplusplus.com/reference/string/string/?kw=stringhttp://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可以解决这样的问题。