vector中去除重复的元素

1. 使用 std::sort 和 std::unique

这种方法首先对 std::vector 进行排序,然后使用 std::unique 函数将相邻的重复元素移到末尾,最后使用 erase 函数删除这些重复元素。

#include <iostream>
#include <vector>
#include <algorithm>

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

    // 排序
    std::sort(vec.begin(), vec.end());

    // 使用 std::unique 移动重复元素到末尾
    auto last = std::unique(vec.begin(), vec.end());

    // 删除重复元素
    vec.erase(last, vec.end());
    //也可以使用一行代码
    //vec.erase(std::unique(vec.begin(), vec.end()), vec.end());

    // 输出结果
    std::cout << "After removing duplicates: ";
    for (int n : vec) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

2. 使用 std::set

这种方法利用 std::set 的特性,即 std::set 中的元素是唯一的。将 std::vector 中的元素插入到 std::set 中,然后再将 std::set 中的元素复制回 std::vector

#include <iostream>
#include <vector>
#include <set>

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

    // 使用 std::set 去重
    std::set<int> s(vec.begin(), vec.end());

    // 将 std::set 中的元素复制回 std::vector
    vec.assign(s.begin(), s.end());

    // 输出结果
    std::cout << "After removing duplicates: ";
    for (int n : vec) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

3. 使用 std::unordered_set

这种方法类似于使用 std::set,但 std::unordered_set 不保证元素的顺序。如果不需要保持元素的顺序,可以使用 std::unordered_set,它的插入和查找操作通常比 std::set 更快。

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

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

    // 使用 std::unordered_set 去重
    std::unordered_set<int> s(vec.begin(), vec.end());

    // 将 std::unordered_set 中的元素复制回 std::vector
    vec.assign(s.begin(), s.end());

    // 输出结果
    std::cout << "After removing duplicates: ";
    for (int n : vec) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

总结
- std::sort 和 std::unique:适合需要保持元素顺序的场景。
- std::set:适合需要自动去重和排序的场景。
- std::unordered_set:适合不需要保持元素顺序且需要高效去重的场景。

选择合适的方法取决于具体的需求和使用场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值