排序,唯一,擦除不起作用

时间:2014-11-06 14:07:00

标签: c++ boost unique erase

我有一个

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)));

同样的结果。 为什么呢?

1 个答案:

答案 0 :(得分: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 

另一个原因可能是,如果向量是类的数据成员,而不是使用此数据成员,则在某些成员函数中使用向量的本地定义。这是初学者的一般错误。

因此,您需要检查是否确实在每个操作中处理了原始向量。