C++ 杂记之三从基础到进阶
大纲
容器
string 容器
string 容器的概念
string 是 STL 的字符串类型,通常用来表示字符串。而在使用 string 之前,字符串通常是用 char* 表示的。string 与 char* 都可以用来表示字符串,两者的区别如下:
string是一个类,char*是一个指向字符的指针string封装了char*来管理字符串,本质是一个char*类型的容器string不用考虑内存释放和越界的问题string负责管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等问题string提供了一系列的字符串操作函数,例如:查找(find)、拷贝(copy)、删除(erase)、替换(replace)、插入(insert)
string 的构造函数
- 默认构造函数:
string(); - 带参数的构造函数:
string(const char *s);,用字符串 s 初始化string(int n, char c);,用n个字符 c 初始化
- 拷贝构造函数:
string(const string &str);
字符串头文件说明
- 在标准 C++ 中,使用
std::string必须显式包含<string>头文件。任何在未包含<string>的情况下仍然能够使用std::string的代码,都依赖于标准库实现的间接包含行为,属于非标准、不可移植的用法。 - 一些标准库实现(例如 libstdc++)在
<iostream>等头文件的内部实现中,可能间接包含了<string>,从而使代码在特定编译器和版本下 "看起来可以正常工作"。然而,这种行为是实现细节,不受 C++ 标准保证,随着编译器、标准库版本或编译选项(如不同的-std=标准级别)变化,代码都有可能无法通过编译。
string 的初始化方式
- C 语言中,字符串的初始化方式
1 | // 使用字符串字面量初始化:末尾自动追加 '\0',其余元素补 0 |
- C++ 中,字符串的初始化方式
1 | // 默认初始化,s1 是空字符串,表示里面没有字符 |
从 string 取得 char*
从 string 取得 char*,可以使用:
const char *c_str() const;,返回一个以\0结尾的字符串的首地址
特别注意,char * 可以隐式转换为 string 类型,反过来则不可以,例如右边这种写法是合法的: char *p = "abc"; string str = p;
将 string 拷贝到 char*
将 string 拷贝到 char* 指向的内存空间,可以使用:
int copy(char *s, int n, int pos=0) const;
将当前串中以 pos 位置开始的 n 个字符拷贝到以 s 为起始位置的字符数组中,返回实际拷贝的字符数量。特别注意,要保证指针 s 所指向的内存空间足以容纳当前的字符串,不然可能会发生越界。
从 string 与范围 for 使用
1 | string s10 = "hello c++"; |
程序运行输出的结果如下:
1 | hello c++ |
