1. string成员函数深度解析与应用实战
作为C++程序员,string类是我们日常开发中最常用的工具之一。但你真的了解它的所有成员函数吗?今天我将结合多年工程经验,带你深入剖析string类的核心成员函数,并通过实际OJ题目演示它们的应用技巧。
1.1 字符串追加操作三剑客
在string类中,有三种常用的字符串追加方式:append、push_back和+=运算符重载。虽然它们都能实现字符串扩展,但各有特点:
- append():最通用的追加方法,支持多种参数形式(字符串、子串、缓冲区等)。其内部实现会先计算需要扩容的大小,然后进行内存分配和内容拷贝。
cpp复制std::string str = "Hello";
str.append(" World"); // 追加完整字符串
str.append(3, '!'); // 追加3个'!'字符
- push_back():专门用于追加单个字符,相当于append的特化版本。在只需要添加一个字符时,它的效率略高于append。
cpp复制std::string str = "Hello";
str.push_back('!'); // 等同于str += '!';
- +=运算符:语法最简洁的追加方式,支持字符串和字符两种形式。在实际编码中,这通常是我们最常用的选择,因为它的可读性最佳。
cpp复制std::string str = "Hello";
str += " World"; // 追加字符串
str += '!'; // 追加字符
注意:这三种操作都会触发字符串的扩容机制。当当前容量不足时,string会按照一定策略(通常是倍增)分配新的内存空间,并将原有内容拷贝到新空间。这是一个相对耗时的操作,特别是在字符串较大时。
1.2 插入与删除操作性能分析
1.2.1 insert()函数的多面性
insert()函数允许我们在字符串的任意位置插入内容,其最常见的重载形式是:
cpp复制basic_string& insert(size_type pos, const charT* s);
使用示例:
cpp复制std::string str = "HelloWorld";
str.insert(5, " "); // 在位置5插入空格,结果为"Hello World"
性能警示:insert操作需要移动插入点之后的所有字符,时间复杂度为O(n)。当字符串较长且插入位置靠前时,这会带来明显的性能损耗。我曾在一个日志处理项目中,因为频繁在字符串开头插入内容,导致性能下降了近40%。
1.2.2 erase()的灵活运用
erase()函数用于删除字符串中的一部分内容,其基本形式为:
cpp复制basic_string& erase(size_type pos = 0, size_type n = npos);
关键特点:
- 如果n大于剩余字符串长度,则删除到字符串末尾
- 如果不指定参数,则清空整个字符串
- 返回引用,支持链式调用
cpp复制std::string str = "HelloWorld";
str.erase(5, 5); // 删除从位置5开始的5个字符,结果为"Hello"
1.3 字符串替换的艺术
replace()函数是字符串处理中的瑞士军刀,它允许我们替换字符串中的任意子串:
cpp复制basic_string& replace(size_type pos, size_type n, const charT* s);
实际案例:将字符串中的所有空格替换为"%%20"
cpp复制std::stri
