tags:
- Cpp
aliases: []
String Library in C++ (NC)
Do this at first: Character Literal & String Literal in C++
template<
class CharType,
class Traits = std::char_traits<CharType>,
class Allocator = std::allocator<CharType>
> class basic_string;
实际上,字符串 string
就是关于不同字符的数组。在 C++ 中,我们有 std::array
的标准库容器,我们还需要 std::basic_string
干嘛?主要是字符串用得太广泛了,许多语言也都有专门的字符串库,甚至在 C++ reference 上,字符串库也被单独罗列了出来。 std::basic_string
是个特别的容器,它只和字符打交道,而且提供许多专门处理字符串的方法。
对于不同的字符,我们使用不同的 string
类。我们最常见的 string
类是 std::string
,但实际上 std::string
只处理 char
类型的字符串。要想让字符串显示更多的信息,我们还有其他的类如 std::wstring
和 std::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!\n
( const 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;
}
namespace pmr {
template<
class CharType,
class Traits = std::char_traits<ChatType>
> using basic_string =
std::basic_string<CharT, Traits, std::pmr::polymorphic_allocator<CharType>>;
}
待补充......
按值传递:拷贝发送
按引用传递+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大小