string的去重函数c++
时间: 2024-07-14 07:00:48 浏览: 194
在C++中,没有内置的`string`类去重函数,但你可以自定义一个函数来实现这个功能。这里是一个简单的示例,使用STL中的`std::set`容器,因为`set`自动去重:
```cpp
#include <iostream>
#include <string>
#include <set>
// 自定义去重函数
std::string removeDuplicates(const std::string& input) {
std::set<char> uniqueChars;
std::string result;
for (char c : input) {
if (uniqueChars.insert(c).second) { // 如果插入成功,说明字符首次出现
result.push_back(c);
}
}
return result;
}
int main() {
std::string input = "hello world";
std::string uniqueString = removeDuplicates(input);
std::cout << "Original string: " << input << std::endl;
std::cout << "Unique string: " << uniqueString << std::endl;
相关问题
c++去重string函数
### C++ 去除字符串中的重复字符
为了去除C++字符串中的重复字符,通常的做法不是调用现成的标准库函数,因为标准模板库 (STL) 中并没有直接提供这样的功能。然而,可以通过组合使用 STL 容器和算法轻松实现这一目标。
一种常见的方式是利用 `std::set` 或者 `std::unordered_set` 来存储已经遇到过的字符,从而自动过滤掉重复项。下面是一个具体的例子:
```cpp
#include <iostream>
#include <string>
#include <set>
std::string removeDuplicates(const std::string& input) {
std::set<char> seen;
std::string result;
for (char c : input) {
// 如果集合中不存在该字符,则添加到结果串并记录下来
if (seen.find(c) == seen.end()) {
result += c;
seen.insert(c);
}
}
return result;
}
int main() {
std::string str = "programming";
std::cout << "Original String: " << str << '\n';
std::cout << "String after removing duplicates: "
<< removeDuplicates(str) << '\n';
return 0;
}
```
上述代码通过遍历输入字符串并将每个新发现的字符加入到返回的结果字符串中来工作。这里使用的数据结构——`std::set`—确保了所有成员都是唯一的[^1]。
另一种更高效的方法是在不需要保持原始顺序的情况下使用 `std::sort()` 和 `std::unique()` 组合操作原地修改字符串:
```cpp
#include <algorithm>
#include <string>
#include <iostream>
void removeConsecutiveDups(std::string& s) {
if (!s.empty()) {
auto new_end = std::unique(s.begin(), s.end());
s.erase(new_end, s.end());
}
}
// 注意这只会移除连续相同的字符
int main(){
std::string text="aaabbbcccdddeeefffggg";
removeConsecutiveDups(text);
std::cout<<text<<"\n";
}
```
这段程序先对整个字符串进行了排序处理使得相同字符相邻排列,之后再应用 `std::unique()` 函数消除这些连续出现的副本[^2]。
C++ 自定义类型的vector 去重
可以使用STL库中的`std::unique`函数对自定义类型的`vector`进行去重操作。但是在使用前需要定义一个比较函数(operator==),用于比较两个自定义类型是否相等。
以下是一个示例代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Person {
string name;
int age;
};
bool operator==(const Person& p1, const Person& p2) {
return (p1.name == p2.name && p1.age == p2.age);
}
int main() {
vector<Person> persons = {{"Alice", 18}, {"Bob", 20}, {"Alice", 18}, {"Cathy", 22}, {"Bob", 20}};
sort(persons.begin(), persons.end()); // 先排序,保证相同元素相邻
auto iter = unique(persons.begin(), persons.end());
persons.erase(iter, persons.end()); // 删除重复元素
for (const auto& person : persons) {
cout << person.name << " " << person.age << endl;
}
return 0;
}
```
在这个例子中,我们定义了一个`Person`结构体,包含姓名和年龄两个成员变量。我们重载了`operator==`,在比较两个`Person`对象是否相等时,只有当它们的姓名和年龄都相等时才返回true。然后我们定义了一个`vector<Person>`类型的`persons`,其中包含了一些重复的`Person`对象。我们首先对`persons`进行了排序,这样相同的元素就相邻了。然后我们调用`unique`函数,它会返回一个指向第一个重复元素的迭代器,我们用这个迭代器来删除重复元素。最后我们遍历`persons`,输出结果。
注意:这个方法只能去除相邻的重复元素,如果有多个相同的元素分散在不同位置,就不能完全去重。如果需要完全去重,可以使用哈希表等数据结构实现。
阅读全文