在C++中,`distinct` 并不是一个标准库中的关键字或函数,但它常被开发者用来描述某种去重操作或独特性检查。以下从实际开发的角度出发,探讨 `distinct` 的四种常见用法,帮助大家更好地理解和应用这一概念。
1. 集合去重(Set Distinct)
在处理数据时,我们经常需要确保集合中没有重复元素。可以使用 STL 中的 `std::set` 或 `std::unordered_set` 来实现这一目标。
```cpp
include
include
include
int main() {
std::vector
std::set
for (const auto& num : unique_numbers) {
std::cout << num << " ";
}
return 0;
}
```
解读:通过将容器转换为 `std::set`,可以自动去除重复元素,并保持唯一性。
2. 迭代器去重(Iterator Distinct)
对于有序容器,可以通过自定义逻辑来实现去重操作。例如,使用双指针算法遍历数组并移除重复项。
```cpp
include
include
void removeDuplicates(std::vector
if (nums.empty()) return;
int writeIndex = 1;
for (size_t readIndex = 1; readIndex < nums.size(); ++readIndex) {
if (nums[readIndex] != nums[readIndex - 1]) {
nums[writeIndex++] = nums[readIndex];
}
}
nums.erase(nums.begin() + writeIndex, nums.end());
}
int main() {
std::vector
removeDuplicates(nums);
for (const auto& num : nums) {
std::cout << num << " ";
}
return 0;
}
```
解读:该方法适用于有序数组,通过比较相邻元素来实现去重。
3. 基于哈希表的去重(Hash Distinct)
当需要高效地判断某个值是否已经存在时,可以利用哈希表的特性。`std::unordered_set` 是一个典型的选择。
```cpp
include
include
include
bool containsDuplicate(const std::vector
std::unordered_set
for (const auto& num : nums) {
if (seen.find(num) != seen.end()) {
return true;
}
seen.insert(num);
}
return false;
}
int main() {
std::vector
if (containsDuplicate(nums)) {
std::cout << "Duplicate found!" << std::endl;
} else {
std::cout << "No duplicates." << std::endl;
}
return 0;
}
```
解读:此方法的时间复杂度接近 O(n),适合大数据集的去重操作。
4. 自定义比较函数的去重(Custom Distinct)
有时,我们需要根据特定规则进行去重。例如,忽略大小写或对复杂对象去重。这时可以结合自定义比较函数实现。
```cpp
include
include
include
struct Person {
std::string name;
int age;
};
bool comparePerson(const Person& a, const Person& b) {
return a.name == b.name && a.age == b.age;
}
int main() {
std::vector
std::sort(people.begin(), people.end(), [](const Person& a, const Person& b) {
return a.name < b.name;
});
auto last = std::unique(people.begin(), people.end(), comparePerson);
people.erase(last, people.end());
for (const auto& person : people) {
std::cout << person.name << " " << person.age << std::endl;
}
return 0;
}
```
解读:通过自定义比较函数,可以灵活地定义去重规则,适用于复杂的场景。
总结
以上四种方式分别从集合、迭代器、哈希表以及自定义规则的角度展示了如何在 C++ 中实现类似 `distinct` 的功能。掌握这些技巧后,您可以在项目中更高效地处理去重问题,提升代码质量和运行效率。