string的去重函数c++
时间: 2024-07-14 20:00:48 浏览: 178
在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++ 自定义类型的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`,输出结果。
注意:这个方法只能去除相邻的重复元素,如果有多个相同的元素分散在不同位置,就不能完全去重。如果需要完全去重,可以使用哈希表等数据结构实现。
使用c++ 实现有结构体数组的递归去重排序
在 C++ 中,你可以通过递归和数据结构如`std::vector`、`std::set`或者自定义`std::unordered_set`来实现结构体数组的去重并排序。这里我们假设有一个结构体`Struct`,它有两个成员,例如`name`和`value`。以下是基本步骤:
1. 首先,你需要创建一个辅助函数,用于递归处理结构体数组,并将去重后的元素添加到集合中。
```cpp
struct Struct {
std::string name;
int value;
};
void removeDuplicates(std::vector<Struct>& arr, std::set<std::pair<std::string, int>>& uniqueSet) {
if (arr.empty())
return;
// 检查当前元素是否已经存在于集合中
auto it = uniqueSet.find({arr[0].name, arr[0].value});
if (it == uniqueSet.end()) {
// 如果不存在,添加到集合中并将原数组的下一个元素传递给递归函数
uniqueSet.insert({arr[0].name, arr[0].value});
removeDuplicates(arr.begin() + 1, uniqueSet);
} else {
// 如果存在,跳过已有的元素
arr.erase(arr.begin());
}
}
```
2. 然后,你可以对原始数组进行排序,这可以使用 C++ 的 `sort` 函数,配合一个比较函数来按值排序。
```cpp
bool compareStructs(const Struct& a, const Struct& b) {
return a.value < b.value; // 按照 value 字段排序
}
// 排序并移除重复项
void sortAndRemoveDuplicates(std::vector<Struct>& arr) {
std::set<std::pair<std::string, int>> uniqueSet;
removeDuplicates(arr, uniqueSet);
// 将集合转换回有序的向量
arr.clear();
for (const auto& pair : uniqueSet) {
arr.push_back(Struct{pair.first, pair.second});
}
std::sort(arr.begin(), arr.end(), compareStructs);
}
```
阅读全文