📜  std :: unique在C++中(1)

📅  最后修改于: 2023-12-03 14:47:42.702000             🧑  作者: Mango

简介

在C++中,unique是一个STL算法,其作用是将相邻的重复元素压缩到容器的末尾,并返回指向经过压缩的范围的新尾部的迭代器。在C++11中,还有一个std::unique_ptr,是一种现代C++中的内存管理工具。

std::unique

功能

std::unique算法用于将重复元素压缩到容器的末尾,并返回指向压缩范围的新尾部的迭代器。具体来说,std::unique的行为如下:

  • 首先,std::unique将输入范围分为已处理和未处理的两部分。
  • 然后,它扫描未处理的元素并将所有与前一个元素不相等的元素移到已处理元素的末尾。
  • 最后,std::unique返回指向被移动的最后一个元素后面的新尾部元素的迭代器。
用法

std::unique有多种用法,其中最基本的用法如下:

template< class ForwardIt >
ForwardIt unique( ForwardIt first, ForwardIt last );

该函数需要两个参数,表示输入范围的首迭代器和末迭代器。例如,假设我们有以下向量:

std::vector<int> vec{1, 1, 2, 2, 3, 3};

我们可以使用std::unique将相邻的重复元素压缩到容器的末尾:

auto it = std::unique(vec.begin(), vec.end());
vec.erase(it, vec.end());

最后,我们可以将迭代器作为标记截取器,将重复元素从容器中删除。

更多用法

除了std::unique,STL还提供了其他一些std::unique的变体。这些变体将额外的谓词作为参数,用于标记相等和不等的元素。例如,我们可以使用自定义谓词来将仅仅只是值相等但是类型不同的元素压缩到容器的末尾:

struct Foo {
    int a, b;
};

auto foo_equal = [](const Foo& lhs, const Foo& rhs) {
    return lhs.a == rhs.a;
};

std::vector<Foo> vec{{1, 2}, {1, 3}, {2, 2}, {2, 3}, {3, 2}, {3, 3}};
auto it = std::unique(vec.begin(), vec.end(), foo_equal);
vec.erase(it, vec.end());

在上面的例子中,我们提供了自定义的谓词foo_equal,它将两个Foo结构体视为相等当且仅当它们的a字段相等。此时,std::unique将第一个元素{1, 2}和第二个元素{1, 3}视为相等,将它们压缩到了容器的末尾。

std::unique_ptr

除了std::unique算法,C++中还有一个std::unique_ptr,是一种现代C++中的内存管理工具。std::unique_ptr是一个智能指针,具有以下几个特点:

  • std::unique_ptr拥有它所指向的对象。当std::unique_ptr离开其作用域时,它所拥有的对象也会被销毁。
  • std::unique_ptr不允许多个智能指针同时拥有同一个对象。这样可以避免内存泄漏和悬空指针。
  • std::unique_ptr支持移动语义。这意味着,你可以将一个std::unique_ptr从一个对象移动到另一个对象,而不需要复制它所拥有的对象。
用法

std::unique_ptr有多种用法,其中最基本的用法如下:

template< class T, class Deleter = std::default_delete<T> >
class unique_ptr;

该类模板需要一个类型参数和一个可选的删除器类型参数。例如,我们可以使用std::unique_ptr来创建一个int类型的指针:

std::unique_ptr<int> ptr(new int(42));

在上面的例子中,我们创建了一个名为ptr的std::unique_ptr对象,它拥有一个动态分配的int类型对象,值为42。当ptr离开其作用域时,它所拥有的int类型对象也会被自动销毁。

更多用法

除了std::unique_ptr的基本用法,C++还提供了其他一些std::unique_ptr的特性,用于更灵活地进行内存管理。例如,我们可以使用std::make_unique来创建std::unique_ptr对象:

auto ptr = std::make_unique<int>(42);

在上面的例子中,我们调用了std::make_unique函数,它创建了一个std::unique_ptr对象,并返回一个指向动态分配的int类型对象的指针。

此外,std::unique_ptr还支持自定义删除器和数组。你可以通过提供自定义删除器来指定std::unique_ptr在销毁所拥有的对象时所要使用的删除函数。你也可以使用std::unique_ptr来管理动态分配的数组。无论你是在处理单个对象还是整个数组,std::unique_ptr都提供了一种简单而安全的内存管理解决方案。

总结

std::unique在C++中既是一个STL算法,又是一种现代C++中的内存管理工具。std::unique算法用于将相邻的重复元素压缩到容器的末尾,并返回指向经过压缩的范围的新尾部的迭代器。std::unique_ptr是一种智能指针,用于简化内存管理,避免内存泄漏和悬空指针。无论你是在处理算法还是内存,std::unique都为你提供了一种简单而强大的解决方案。