由于我对之前的回答不满意,现在是我的回答。您最初的问题没有提到向量有多大。假设您的
std :: vector <>
非常大,几乎没有重复项(为什么不呢?)。这意味着使用另一个容器(例如
std :: set <>
)基本上会使您的内存消耗翻倍。既然您的目标只是计算非重复项,为什么要这样做呢?
我喜欢@Flame的答案,但我对调用
std::unique
并不满意。您花了很多时间仔细排序您的向量,然后简单地丢弃了已排序的数组,而您之后可以重复使用它。
我在STD库中找不到任何真正优雅的东西,所以这是我的建议(混合使用
std :: transform
+
std :: abs
+
std :: sort ,但之后不触摸排序的数组)。
template<class ForwardIt>
typename std::iterator_traits<ForwardIt>::difference_type
count_unique(ForwardIt first, ForwardIt last)
{
if (first == last)
return 0;
typename std::iterator_traits<ForwardIt>::difference_type
count = 1;
ForwardIt previous = first;
while (++first != last) {
if (!(*previous == *first) ) ++count;
++previous;
}
return count;
}
额外加分点是它可以与前向迭代器一起使用:
#include <iostream>
#include <list>
int main()
{
std::list<int> nums {1, 3, 3, 3, 5, 5, 7,8};
std::cout << count_unique( std::begin(nums), std::end(nums) ) << std::endl;
const int array[] = { 0,0,0,1,2,3,3,3,4,4,4,4};
const int n = sizeof array / sizeof * array;
std::cout << count_unique( array, array + n ) << std::endl;
return 0;
}