C++ 排序、唯一、擦除无效

C++ 排序、唯一、擦除无效,c++,boost,unique,erase,C++,Boost,Unique,Erase,我有一个 std::vector<int> gid; std::vector-gid; 包含非有序整数的。我想排序,生成唯一的值,并删除重复的整数。我尝试了以下代码: std::sort(gid.begin(),gid.end()); std::vector<int>::iterator itv(std::unique(gid.begin(),gid.end())); gid.erase(itv,gid.end()); 排序(gid.begin(),gid.end

我有一个

std::vector<int> gid; 
std::vector-gid;
包含非有序整数的。我想排序,生成唯一的值,并删除重复的整数。我尝试了以下代码:

std::sort(gid.begin(),gid.end());
std::vector<int>::iterator itv(std::unique(gid.begin(),gid.end()));
gid.erase(itv,gid.end());
排序(gid.begin(),gid.end()); std::vector::iterator itv(std::unique(gid.begin(),gid.end()); 擦除(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) );
排序(gid.begin(),gid.end()); std::vector::iterator itv(std::unique(gid.begin(),gid.end()); 调整大小(std::distance(gid.begin(),itv)); 同样,向量只按排序排序。 我还尝试了增强:

boost::erase(gid, boost::unique<boost::return_found_end>(boost::sort(gid)));
boost::erase(gid,boost::unique(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;
}
我可以怀疑你通过值而不是引用将向量传递给函数。因此,可以更改原始向量的副本。比如说

#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;
}
但是如果您将参数声明更改为

#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