String Library in C++ (NC)

Basic Strings

template<
    class CharType,  
    class Traits = std::char_traits<CharType>,  
    class Allocator = std::allocator<CharType>  
> class basic_string;

Just an Array of Characters

实际上,字符串 string 就是关于不同字符的数组。在 C++ 中,我们有 std::array 的标准库容器,我们还需要 std::basic_string 干嘛?主要是字符串用得太广泛了,许多语言也都有专门的字符串库,甚至在 C++ reference 上,字符串库也被单独罗列了出来。 std::basic_string 是个特别的容器,它只和字符打交道,而且提供许多专门处理字符串的方法。

对于不同的字符,我们使用不同的 string 类。我们最常见的 string 类是 std::string,但实际上 std::string 只处理 char 类型的字符串。要想让字符串显示更多的信息,我们还有其他的类如 std::wstringstd::u32string 等。而这些不同的 string 类实际上就是:

typedef std::basic_string<char> std::string;
typedef std::basic_string<char8_t> std::u8string; // Since C++20
typedef std::basic_string<wchar_t> std::wstring;
typedef std::basic_string<char16_t> std::u16string;
typedef std::basic_string<char32_t> std::u32string;

不同的 string 类中只是字符类型不同,它们的操作都是一样的。我们下面以 std::string 为例来进行讲解。

std::string

上面,我们看到 std::string 实际上就是 std::basic_string<char>。在这小节,我们将依托 std::basic_string<char> 学习 std::basic_string 库中的一些成员函数。

std::string 并不仅仅包括字符串数据,它还存储了字符串数据长度和字符串数组容量的信息。这些信息用于支持简便好用的库成员函数能够发挥作用。

举个例子,在下面的代码中,我们用了一个一个字符串字面量 hello, world!\nconst char*, 即一个 C 类型字符串)来初始化一个 std::string 类型的变量。这里,我们先是输出了变量 s 的地址,后面再用 s.data() 选择输出字符串所在的地址。你会发现它们输出的地址并不会相同。

#include <iostream>
#include <string>

int main(){
	std::string s = "hello, world!\n";
	std::cout << &s << std::endl;
	std::cout << (void*)s.data() << std::endl;
	return 0;
}

Polymorphic Memory Resource Version of a Basic String

namespace pmr {  
template<  
    class CharType,  
    class Traits = std::char_traits<ChatType>
> using basic_string =  
    std::basic_string<CharT, Traits, std::pmr::polymorphic_allocator<CharType>>;
}

待补充......

String View (C++17)

按值传递:拷贝发送

按引用传递+const:避免了拷贝的发生同时避免了修改

但如果原值是一个 const char*呢

void allocPrint(std::string& str){ // A string allocation on heap is made

}
void noAllocPrint(std::string_view& str){ // No heap allocation is made

}
int main(){
	const str* = "hello, world!";
	printStr(str);
	noAllocPrint(str);
}

实现仅为一个CharType指针和string大小