1. 字符串处理三剑客:substr、erase与unique的深度解析
在C++的日常开发中,字符串处理是最基础也最频繁的操作之一。string类提供的substr、erase和unique这三个方法,就像字符串处理领域的"瑞士军刀",每个都有其独特的用途和适用场景。本文将深入探讨这三个方法的原理、使用技巧和实际应用中的坑点。
1.1 substr:精准提取子字符串
substr方法用于从字符串中提取指定位置的子串,其基本语法有两种形式:
cpp复制string substr(size_t pos = 0, size_t len = npos) const;
其中pos表示起始位置(默认为0),len表示要提取的子串长度(默认为npos,即直到字符串末尾)。这个方法不会修改原字符串,而是返回一个新的字符串对象。
实际应用示例:
cpp复制string url = "https://www.example.com/path/to/resource";
size_t protocol_end = url.find("://");
string protocol = url.substr(0, protocol_end); // 提取协议部分
string domain = url.substr(protocol_end + 3); // 提取域名及后续部分
注意:substr的参数pos如果超出字符串长度,会抛出out_of_range异常。安全起见,在使用前应先检查pos的有效性。
1.2 erase:灵活删除字符串内容
erase方法是string类中最强大的修改方法之一,它有多种重载形式,可以满足不同的删除需求:
cpp复制// 删除从pos开始的len个字符
basic_string& erase(size_type pos = 0, size_type len = npos);
// 删除单个字符(通过迭代器)
iterator erase(const_iterator position);
// 删除一个范围内的字符
iterator erase(const_iterator first, const_iterator last);
性能考虑: erase操作的时间复杂度取决于删除后需要移动的字符数量。删除字符串中间的字符通常比删除末尾的字符代价更高,因为后面的所有字符都需要向前移动。
实用技巧:
- 要删除字符串中的所有特定字符,可以结合find和erase使用循环
- 批量删除时,考虑先收集所有需要删除的位置,然后从后向前删除,避免索引变化问题
1.3 unique:去除连续重复字符
严格来说,C++标准库的string类并没有直接
