2014-11-06 77 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如果向量是类的数据成员,而不是使用此数据成员,则在某些成员函数中使用向量的局部定义。这是初学者的一个普遍错误。

所以你需要检查你是否确实在每个操作中处理原始矢量。