array 的 unique() 函数如何工作
How unique() function for array works
int a[4] = {3,1,2,3};
sort(a,a+n);
int j = unique(a,a+n) - a; // j=3
在此代码中,变量 j
returns 数组中唯一元素的总数 a
。但是我无法理解这段代码是如何工作的。
我知道在列表中,
list::unique() 是 C++ STL 中的一个内置函数,它从列表中删除所有重复的连续元素。它仅适用于排序列表。
std::unique()
将移动范围 [a+0, a+n)
中的重复项,并且它 returns 是该范围内的一个新迭代器,它将标记数组的新“结束”,即,第一个非唯一项现在移至数组中的位置。
如果您随后从该迭代器中减去起始迭代器(您使用 unique(a,a+n) - a;
执行的操作),您将获得数组开头和新“结尾”之间的元素数。这就是您能够获得唯一元素计数的方法。
需要注意的是,我这里用“end”是因为数组有固定的大小。您实际上根本没有改变数组的大小,您只是将重复的元素移到数组的后面,并将唯一元素保留在前面。
还需要注意的是,发生这种情况后,unique()
返回的迭代器及其之后的所有内容都将具有未指定的值。为它们设置新值是合法的,但使用未指定的值会导致未定义的行为。
int a[4] = {3,1,2,3};
sort(a,a+n);
int j = unique(a,a+n) - a; // j=3
在此代码中,变量 j
returns 数组中唯一元素的总数 a
。但是我无法理解这段代码是如何工作的。
我知道在列表中,
list::unique() 是 C++ STL 中的一个内置函数,它从列表中删除所有重复的连续元素。它仅适用于排序列表。
std::unique()
将移动范围 [a+0, a+n)
中的重复项,并且它 returns 是该范围内的一个新迭代器,它将标记数组的新“结束”,即,第一个非唯一项现在移至数组中的位置。
如果您随后从该迭代器中减去起始迭代器(您使用 unique(a,a+n) - a;
执行的操作),您将获得数组开头和新“结尾”之间的元素数。这就是您能够获得唯一元素计数的方法。
需要注意的是,我这里用“end”是因为数组有固定的大小。您实际上根本没有改变数组的大小,您只是将重复的元素移到数组的后面,并将唯一元素保留在前面。
还需要注意的是,发生这种情况后,unique()
返回的迭代器及其之后的所有内容都将具有未指定的值。为它们设置新值是合法的,但使用未指定的值会导致未定义的行为。