簡體   English   中英

std :: unique是否會使向量迭代器無效?

[英]Does std::unique invalidate vector iterators?

對於此代碼:

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以來,只是在Vector內部移動了東西,並且沒有在其中插入任何東西,沒有迭代器應該被使無效,因此我計算unique_count的方式應該是正確的。 但我想確保確實如此。 是嗎?

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

std::unique將迭代器返回到容器中最后一個“ unique”元素之后的某個位置。

auto last = std::unique(v.begin(), v.end());

然后范圍[ lastv.end() )包含任何內容,您不能依賴v.cbegin() 代替:

auto unique_count = std::distance(v.begin(), last);

會成功的

http://en.cppreference.com/w/cpp/algorithm/unique

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM