C++ unique

algorithm中的unique  用于去除指定容器中重复的元素,返回一个没有重复元素的序列的最后一个元素,要打印这样的数据信息则从容器的begin()开始到这个返回的地方就可以了。

 

    vector<string> strvec;

    cout << "use unique" << endl;
   vector<string>::iterator it = strvec.begin();
    vector<string>::iterator ituniq = unique(it,strvec.end());
    //ituniq 指向的是去除重复元素之后的最后一个元素位置
    cout << "use unique after" << endl;
    i = 1;
    while(it != ituniq){
        cout << i << ":" << *it << endl;
        ++it;
        ++i;
    }
    cout << endl;

 

 

按照以上的操作就可以完成对去除重复部分的容器数据打印。

切记:对应的重复数据并没有删除,只是放到了容器unique返回的那个位置之后了

<think>好的,用户想了解C++unique相关的概念或用法,尤其是unique_ptr和std::unique相关的部分。首先,我需要确认用户的问题是否涉及智能指针中的unique_ptr,或者是STL算法中的std::unique函数。这两个都是C++中重要的“unique”概念,但用途不同。 先看unique_ptr,这是C++11引入的智能指针,用于独占所有权管理,确保只有一个指针拥有对象,避免内存泄漏。需要解释它的基本用法,比如如何创建、转移所有权,以及自定义删除器的使用。例如,用户可能想知道如何正确释放资源,或者在多线程中是否安全。 然后是std::unique算法,位于<algorithm>头文件中,用于去除相邻的重复元素。这里需要说明它的使用场景,如何配合sort使用,以及返回的迭代器位置。用户可能容易混淆它和容器的unique方法,比如std::list::unique,需要指出区别。 还要注意用户可能的误解,比如认为std::unique会直接删除所有重复元素,而实际上只是移动元素,需要配合erase使用。此外,unique_ptr的所有权转移和拷贝构造的限制也是重点,用户可能会遇到相关编译错误,需要举例说明。 需要引用相关的资料,比如引用[3]提到的智能指针和原子操作,虽然atomic_shared_ptr和unique_ptr不同,但可以说明智能指针的整体设计。引用[2]关于虚函数的部分可能不相关,但引用[4]的关键代码实现可能涉及示例代码的结构。 用户可能的深层需求是资源管理和去重操作,所以应用场景的举例会有帮助。比如在避免内存泄漏时使用unique_ptr,或在数据处理时使用std::unique来去重。 最后,生成相关问题时要覆盖这两个方面,并引导用户深入学习,比如性能优化、自定义删除器、算法复杂度等。</think>### C++unique相关概念详解 #### 一、unique_ptr智能指针 1. **基本特性** - 独占所有权:同一时间只能有一个unique_ptr指向特定对象 - 自动内存管理:超出作用域时自动释放资源 $$std::unique\_ptr<T> ptr = std::make\_unique<T>(args);$$ - 禁止拷贝构造:只能通过移动语义转移所有权 ```cpp auto ptr2 = std::move(ptr1); // 所有权转移 ``` 2. **自定义删除器** 支持通过函数对象定制资源释放方式: ```cpp auto file_deleter = [](FILE* f) { fclose(f); }; std::unique_ptr<FILE, decltype(file_deleter)> file_ptr(fopen("test.txt", "r"), file_deleter); ``` 3. **数组支持** 提供数组特化版本: $$std::unique\_ptr<T[]> arr = std::make\_unique<T[]>(10);$$ #### 二、std::unique算法 1. **基本用法** 去除相邻重复元素(需先排序): ```cpp std::vector<int> v {2,1,2,3,3,2,2,1}; std::sort(v.begin(), v.end()); auto last = std::unique(v.begin(), v.end()); v.erase(last, v.end()); // 实际删除多余元素[^4] ``` 2. **自定义比较器** 支持自定义相等判断: ```cpp auto comp = [](const A& a1, const A& a2) { return a1.id == a2.id; }; std::unique(vec.begin(), vec.end(), comp); ``` #### 三、关键差异对比 | 特性 | unique_ptr | std::unique | |--------------------|----------------------------|-------------------------| | 所属范畴 | 智能指针(<memory>) | 算法(<algorithm>) | | 主要功能 | 资源生命周期管理 | 容器元素去重 | | 时间复杂度 | O(1) | O(n) | | 修改容器结构 | 否 | 是(需配合erase) | #### 四、应用场景示例 1. **unique_ptr适用场景** - 工厂模式创建对象 - 异常安全保证 - 多态对象管理 ```cpp class Base { public: virtual ~Base() = default; // ... }; std::unique_ptr<Base> obj = createDerived(); ``` 2. **std::unique适用场景** - 日志去重 - 数据清洗 - 统计唯一值 ```cpp std::list<int> lst {1,1,2,3,3}; lst.unique(); // 直接修改链表结构[^3] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值