C++ string之unique(),erase(),sort()使用小记

本文介绍如何使用 C++ 中的 uniqe() 函数去除字符串中的重复字符,并通过排序展示字符排列方式。同时,阐述了 erase() 和 sort() 函数在处理字符串时的应用,以及如何在操作后正确更新字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 uniqe()函数是去掉重复的字符。是只两个相同的字符连续出现就只留下一个,其余的就删除。例如:

 string s("hello,world");

 string::iterator iterEnd=unique(s.begin(),s.end());

这代码执行后,s的值为helo,worldd. 只消除连续出现的同样的字符。不连续的不消除。 还有一个就是unqiue()函数删除重复的字符后,字符串长度不变,所以如果字符串删除字符后,后面按照之前的值填上。 所以就是helo,worldd,而不是helo,world;

所以就会有一个函数erase()函数存在的必要性了。它可以删除字符。

 s.erase(iterEnd,s.end());

  执行后s的值就是我们想要的helo,world.

  sort()函数是排序字符串字符。 即如果是akjsc,排序后为acjks.

   所以一般用unique函数的时候都会用到erase(). sort()用到也也比较多。

### C++ 中 `std::string` 和 `std::vector` 的 `erase` 方法 #### 1. `std::string` 的 `erase` 方法 `std::string` 提供了两种主要形式的 `erase` 方法,用于移除字符串中的某些部分。 - 移除特定位置的一个字符: ```cpp #include <iostream> #include <string> int main() { std::string str = "HelloWorld"; str.erase(5, 1); // 删除索引5处的字符(即'Helloworld'中的'o') std::cout << str << std::endl; } ``` 此代码将删除索引为5的字符[^1]。 - 移除一段子串: ```cpp str.erase(0, 5); // 删除从索引0开始长度为5的部分(即"Hello") ``` 这一行代码会把字符串前五个字符全部清除掉[^1]。 还可以通过迭代器指定范围来进行擦除操作: ```cpp str.erase(str.begin()+3, str.begin()+6); // 这表示从第四个字符到第六个字符之间的所有内容都将被抹去 ``` --- #### 2. `std::vector` 的 `erase` 方法 对于 `std::vector` 而言,其提供了更加灵活的方式来进行元素的删除工作。 - 利用单个迭代器来删除某个具体位置上的元素: ```cpp #include <iostream> #include <vector> int main(){ std::vector<int> vec={1,2,3,4,5}; vec.erase(vec.begin()+2); // 删除第三个元素也就是数字‘3’ for(auto elem:vec){ std::cout<<elem<<" "; } } ``` 上述例子展示了如何借助迭代器找到待删节点并调用成员函数完成任务[^2]。 - 同时也可以传递一对代表区间的两个端点之迭代器给它从而一次性消除多个连续项: ```cpp vec.erase(vec.begin()+1, vec.begin()+4); // 此命令将会连同第二至第四共三项一齐销毁 ``` 值得注意的是当执行完这样的动作之后剩余下来的那些实体们会被向前移动填补空白区域[^3]。 另外需要注意一点就是虽然我们可以单独依靠 remove 来标记哪些应该被淘汰的对象可是只有配合 erase 才能真正意义上减少容器尺寸因为前者仅仅只是逻辑意义上的排除而已并不会真的释放相应存储单元所以通常我们会组合起来运用如下所示: ```cpp vec.erase(std::remove(vec.begin(), vec.end(), value_to_remove), vec.end()); ``` 这里先由算法找出所有匹配的目标然后交给后者正式实施清理过程[^4]。 --- #### 3. 主要区别对比 | 特性 | `std::string::erase` | `std::vector::erase` | |-------------------------|-----------------------------------------------|--------------------------------------------| | **适用对象** | 针对字符串操作 | 对动态数组(即矢量)执行修改 | | **输入参数类型** | 基于索引或迭代器 | 必须使用迭代器 | | **返回值** | 返回指向下一个有效字符的迭代器 | 返回指向最后一个已删除元素后面那个位置的新迭代器 | | **时间复杂度** | O(n),其中 n 是受影响的字符数量 | 平均情况下也是O(n) | 尽管二者都能达到相似的目的——即去除不需要的信息片段;然而它们针对的具体场合却有所不同因此在实际开发当中应当依据实际情况作出恰当的选择以期获得最佳效果[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值