对于此代码:
std::vector<int> v = {...};
std::sort(v.begin(), v.end());
// Does this work?
std::size_t unique_count = std::unique(v.begin(), v.end()) - v.cbegin();
在最后一行中,我认为因为std::unique
只是在向量内部移动东西并且没有向其中插入任何内容,所以不应该使迭代器无效,因此我正在计算unique_count
的方式应该是正确的。但我想确保是这样的。是吗?
答案 0 :(得分:5)
std::unique
是一种算法。所有stl算法都在范围内运行,而不是容器。
虽然算法可以交换元素内容,但是这些元素的迭代器保持不变。
这是一种保证。
如果不是,那么这不起作用:
#include <algorithm>
#include <vector>
#include <iostream>
#include <array>
int main()
{
auto unique_size = [](auto&& container)
{
std::sort(std::begin(container), std::end(container));
return std::unique(std::begin(container), std::end(container)) - std::cbegin(container);
};
std::cout << unique_size(std::vector<int> {6,5,4,4,3,2,1}) << std::endl;
std::cout << unique_size(std::array<int,7> {6,5,4,4,3,2,1}) << std::endl;
int x[] = {6,5,4,4,3,2,1};
std::cout << unique_size(x) << std::endl;
// Does this work? yes.
}
强制性输出:
6
6
6
答案 1 :(得分:3)
std::unique
将迭代器返回到容器中最后一个'unique'元素之后的一个位置。
auto last = std::unique(v.begin(), v.end());
然后范围[last
,v.end()
)包含任何内容,您不能依赖v.cbegin()
。代替:
auto unique_count = std::distance(v.begin(), last);
会做到这一点。