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)
stirng 容器的 API
构造函数
- 默认构造函数:
string();
- 带参数的构造函数:
string(const char *s);
,用字符串 s 初始化string(int n, char c);
,用n
个字符 c 初始化
- 拷贝构造函数:
string(const string &str);
string 的长度
size_t size() const
,返回当前字符串的长度,这里的长度不包括字符串的结尾的\0
字符size_t length() const;
,返回当前字符串的长度,这里的长度不包括字符串的结尾的\0
字符bool empty() const;
,判断当前字符串是否为空
值得一提的是,sizeof()
返回的是对象所占用空间的字节数,strlen()
返回的是字符数组中第一个 \0
前的字节数,string
的成员函数 size()
和 length()
没有任何区别。
string 的赋值
string &operator=(const string &s);
,把字符串 s 赋给当前的字符串string &assign(const char *s);
,把字符串 s 赋给当前的字符串string &assign(const char *s, int n);
,把字符串 s 的前n
个字符赋给当前的字符串string &assign(const string &s);
,把字符串 s 赋给当前字符串string &assign(int n, char c);
,用n
个字符 c 赋值给当前字符串string &assign(const string &s, int start, int n);
,把字符串 s 中从 start 开始的n
个字符赋值给当前字符串
string 的子串
string substr(int pos=0, int n=npos) const;
,返回由pos
位置开始的n
个字符组成的子字符串
string 的查找
int find(char c, int pos=0) const;
,从pos
位置开始查找字符 c 在当前字符串第一次出现的位置int find(const char *s, int pos=0) const;
,从pos
位置开始查找字符串 s 在当前字符串第一次出现的位置int find(const string &s, int pos=0) const;
,从pos
位置开始查找字符串 s 在当前字符串第一次出现的位置int rfind(char c, int pos=npos) const;
,从pos
位置开始查找字符 c 在当前字符串中最后一次出现的位置int rfind(const char *s, int pos=npos) const;
,从pos
位置开始查找字符串 s 在当前字符串中最后一次出现的位置int rfind(const string &s, int pos=npos) const;
,从pos
位置开始查找字符串 s 在当前字符串中最后一次出现的位置
值得一提的是,当 find()
与 rfind()
函数查找不到时,都会返回 -1
;两者不同的是 find()
是正向查找,而 rfind()
是逆向查找,但是最终两个函数返回的位置均是字符 /
字符串出现的正向位置;若有重复字符 /
字符串时,则 rfind()
返回的是逆向查找到的字符 / 字符串在正向的位置(即最后一次出现的正向位置)。
string 的替换
string &replace(int pos, int n, const char *s);
,删除从pos
位置开始的n
个字符,然后在pos
位置插入字符串 sstring &replace(int pos, int n, const string &s);
,删除从pos
位置开始的n
个字符,然后在pos
位置插入字符串 svoid swap(string &s2);
,交换当前字符串与字符串 s2 的值
string 的比较
int compare(const string &s) const;
,与字符串 s 比较int compare(const char *s) const;
,与字符串 s 比较
compare()
函数的结果在 >
时返回 1,<
时返回 -1,=
时返回 0。字符串比较区分大小写,比较时参考字典顺序,排越前面的越小。大写的 A(65) 比小写的 a(97) 小。
string 的字符存储
char &at(int n);
char &operator[] (int n);
operator[]
和at()
均返回当前字符串中的第n
个字符,但二者是有区别的at()
在越界时会抛出异常,[]
在刚好越界时会返回(char)0
,再继续越界时,程序异常终止- 如果程序希望可以通过
try catch
捕获异常,则建议采用at()
string 的区间插入
string &insert(int pos, const char *s);
,在pos
位置插入字符串 s,返回修改后的字符串string &insert(int pos, const string &s);
,在pos
位置插入字符串 s,返回修改后的字符串string &insert(int pos, int n, char c);
,在pos
位置插入n
个字符 c,返回修改后的字符串
string 的区间删除
string &erase(int pos=0, int n=npos);
,删除从pos
位置开始的n
个字符,返回修改后的字符串
string 的字符串拼接
string &operator+=(const string &s);
,把字符串 s 连接到当前字符串的结尾string &operator+=(const char *s);
,把字符串 s 连接到当前字符串的结尾string &append(const char *s);
,把字符串 s 连接到当前字符串的结尾string &append(const char *s, int n);
,把字符串 s 的前n
个字符连接到当前字符串的结尾string &append(const string &s);
,把字符串 s 连接到当前字符串的结尾string &append(const string &s, int pos, int n);
,把字符串 s 中从pos
位置开始的n
个字符连接到当前字符串的结尾string &append(int n, char c);
,在当前字符串的结尾添加n
个字符 c
从 string 取得 char*
const char *c_str() const;
,返回一个以\0
结尾的字符串的首地址
值得一提的是,char *
可以隐式转换为 string
类型,反过来则不可以,例如右边这种写法是合法的: char *p = "abc"; string str = p;
将 string 拷贝到 char* 指向的内存空间
int copy(char *s, int n, int pos=0) const;
将当前串中以 pos
位置开始的 n
个字符拷贝到以 s
为起始位置的字符数组中,返回实际拷贝的字符数量。特别注意,要保证指针 s
所指向的内存空间足以容纳当前的字符串,不然可能会发生越界。
string 容器的常用操作
- string 容器的构造与赋值
1 |
|
程序运行输出的结果如下:
1 | str1 = 123456 |
- string 容器的 API 调用
1 |
|
程序运行输出的结果如下:
1 | a b c d e |
map 容器
map 容器的概念
map 是 STL 的一个关联式容器,它提供一对一(其中第一个称为关键字,每个关键字只能在 map 中出现一次,第二个称为该关键字的值)的数据处理能力。map 容器存储的都是 pair
对象,也就是用 pair
类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。通常情况下,map 容器中存储的各个键值对都选用 string 字符串作为键的类型。map 内部自建了一颗红黑树 (一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在 map 内部所有的数据都是有序的。map 的特点是增加和删除节点对迭代器的影响很小,除了那个被操作的节点,对其他的节点都没有什么影响。值得一提的是,使用 map 容器存储的各个键值对,键的值既不能重复也不能被修改。map 可以根据 key 值快速查找记录,复杂度在 log(n)
级别,如果有 1000 条记录,最多查找 10 次,如果有 1000000 条记录,最多查找 20 次。
map 容器的常用操作
1 |
|
程序运行输出的结果如下:
1 | key = 1 , 2 |