C++利用容器查找重复列功能实现


在C++中,如果你想要利用容器(如`std::vector`)来查找重复的元素,你可以采用多种方式。一个高效且常用的方法是使用`std::unordered_set`(或`std::set`,但如果你关心的是查找效率而不是元素的排序,那么`std::unordered_set`是更好的选择)来跟踪已经出现过的元素。以下是一个简单的实现示例:


#include <iostream>
#include <vector>
#include <unordered_set>

// 查找并打印vector中的重复元素
void findDuplicates(const std::vector<int>& vec) {
    std::unordered_set<int> seen;
    std::vector<int> duplicates; // 用于存储重复的元素

    for (int num : vec) {
        if (seen.find(num) != seen.end()) {
            // 如果已经在seen中,则添加到duplicates中
            duplicates.push_back(num);
        } else {
            // 否则,添加到seen中
            seen.insert(num);
        }
    }

    // 打印重复的元素
    std::cout << "Duplicate elements: ";
    for (int num : duplicates) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
}

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 2, 5, 3, 6};
    findDuplicates(vec);
    return 0;
}

这段代码首先定义了一个`findDuplicates`函数,它接受一个`std::vector`作为参数。函数内部,使用一个`std::unordered_set`来存储已经遍历过的元素,以便在后续遍历中快速检查某个元素是否已经出现过。如果发现一个元素已经存在于`seen`中,则将其添加到`duplicates`向量中。最后,函数遍历`duplicates`向量并打印出所有重复的元素。

请注意,这个实现不会去除`vec`中的重复元素,只是找出并打印了它们。如果你需要去除重复元素,你可以考虑使用`std::vector`的`erase-remove`惯用法,或者先使用`std::set`(或`std::unordered_set`,如果你不需要排序)来过滤掉重复元素,然后再将结果转换回`std::vector`。但是,这些都不是你的问题直接要求的,所以我在这里没有包含这些额外的步骤。