std :: unique是否会使向量迭代器失效?

Ziz*_*Tai 1 c++ algorithm iterator

对于此代码:

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();
Run Code Online (Sandbox Code Playgroud)

在最后一行中,我认为既然std::unique只是在向量内部移动东西并且不向其中插入任何内容,则不应使迭代器无效,因此我计算的方式unique_count应该是正确的.但我想确保是这样的.是吗?

Ric*_*ges 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.
}
Run Code Online (Sandbox Code Playgroud)

强制输出:

6
6
6
Run Code Online (Sandbox Code Playgroud)