2016-07-08 62 views
0

對於此代碼:是不是std :: unique invalidate向量迭代器?

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應該是正確的。但我想確保是這樣。是嗎?

+1

不,不會。它甚至不能訪問容器,因爲你只是傳遞了2個迭代器。 – songyuanyao

+0

@songyuanyao所以,'unique_count'是正確的。對? –

+0

是的,它會很好。 – songyuanyao

回答

3

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 
2

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

+1

你是什麼意思我不能依靠'v.cbegin()'? –

+0

抱歉,我的意思是[last,end()]丟失了內容。我會使用std :: distance而不是手動創建差異。 –

+0

基本上'std :: distance'將在這裏用'last - v.begin()'做同樣的事情。 – songyuanyao