数组的 unique() 函数如何工作

UNR*_*EAL 1 c++ arrays sorting unique

int a[4] = {3,1,2,3};
sort(a,a+n);
int j = unique(a,a+n) - a; // j=3
Run Code Online (Sandbox Code Playgroud)

在此代码变量中j返回数组中唯一元素的总数a。但我无法理解这段代码是如何工作的。

我知道在列表中,
list::unique() 是 C++ STL 中的一个内置函数,它从列表中删除所有重复的连续元素。它仅适用于排序列表。

Nat*_*ica 8

std::unique()将移动 range 中的重复项[a+0, a+n),并返回该范围内的一个新迭代器,该迭代器将标记数组的新“结束”,即现在将第一个非唯一项移动到数组中的位置。

如果您然后从该迭代器中减去开始迭代器(您使用 )unique(a,a+n) - a;,您将获得数组开始和新“结束”之间的元素数。这就是您如何能够获得唯一元素的数量。

应该注意的是,我在这里使用“结束”是因为数组具有固定大小。您实际上根本没有更改数组的大小,您只是将重复的元素移动到数组的后面,并将唯一的元素保留在前面。

还应该注意的是,发生这种情况后,返回的迭代器处和之后的所有内容都unique()将具有未指定的值。为它们设置新值是合法的,但使用未指定的值会导致未定义的行为。