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

sort, unique, erase does not work

本文关键字:不起作用 擦除 唯一 排序      更新时间:2023-10-16

我有一个

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

同样的结果。为什么?

此演示程序已成功编译并产生预期结果

#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 

另一个原因可能是,如果向量是类的数据成员,而不是使用该数据成员,则可以在某个成员函数中使用向量的局部定义。这是初学者的普遍错误。

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