2014-11-06 76 views
0

我有一個排序,獨特,擦除不起作用

std::vector<int> gid; 

包含非有序整數。我想排序,創建獨特的值,並刪除重複的整數。我試着用下面的代碼:

std::sort(gid.begin(),gid.end()); 
std::vector<int>::iterator itv(std::unique(gid.begin(),gid.end())); 
gid.erase(itv,gid.end()); 

但最終的向量只是有序的。 因此,我試圖

std::sort(gid.begin(),gid.end()); 
std::vector<int>::iterator itv(std::unique(gid.begin(),gid.end())); 
gid.resize(std::distance(gid.begin(),itv)); 

又一次的矢量只與排序排序。 我也試圖與升壓:

boost::erase(gid, boost::unique<boost::return_found_end>(boost::sort(gid))); 

再次相同的結果。 爲什麼?

+4

按預期運行[此處](https://ideone.com/VghsbZ)。 – Jarod42 2014-11-06 14:11:11

+1

最有可能你的代碼檢查後向量中的內容是錯誤的。 – 2014-11-06 14:12:12

+3

除非您提供的代碼能夠複製您正在觀察的行爲,否則我們無法爲您提供幫助。代碼似乎是正確的。 – 2014-11-06 14:12:38

回答

2

這種說明性程序被成功編譯併產生預期的結果

#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() 
{ 
    std::vector<int> gid = { 2, 1, 5, 6, 1, 6, 2, 5 }; 

    std::sort(gid.begin(), gid.end()); 
    std::vector<int>::iterator itv(std::unique(gid.begin(), gid.end())); 
    gid.erase(itv, gid.end()); 

    for (int x : gid) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

輸出是

1 2 5 6 

我可以懷疑你通過值而不是通過引用傳遞載體的功能。因此,您可以更改原始矢量的副本。例如

#include <iostream> 
#include <vector> 
#include <algorithm> 

void remove_duplicates(std::vector<int> gid) 
{ 
    std::vector<int>::iterator itv(std::unique(gid.begin(), gid.end())); 
    gid.erase(itv, gid.end()); 
} 

int main() 
{ 
    std::vector<int> gid = { 2, 1, 5, 6, 1, 6, 2, 5 }; 
    std::sort(gid.begin(), gid.end()); 

    remove_duplicates(gid); 

    for (int x : gid) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

輸出將是

1 1 2 2 5 5 6 6 

但如果你將改變參數聲明類似

#include <iostream> 
#include <vector> 
#include <algorithm> 

void remove_duplicates(std::vector<int> &gid) 
{ 
    std::vector<int>::iterator itv(std::unique(gid.begin(), gid.end())); 
    gid.erase(itv, gid.end()); 
} 

int main() 
{ 
    std::vector<int> gid = { 2, 1, 5, 6, 1, 6, 2, 5 }; 
    std::sort(gid.begin(), gid.end()); 

    remove_duplicates(gid); 

    for (int x : gid) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

那麼結果會像預期的

1 2 5 6 

另一個原因ca如果向量是類的數據成員,而不是使用此數據成員,則在某些成員函數中使用向量的局部定義。這是初學者的一個普遍錯誤。

所以你需要檢查你是否確實在每個操作中處理原始矢量。