我有一个
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)));
同样的结果。 为什么呢?
答案 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
另一个原因可能是,如果向量是类的数据成员,而不是使用此数据成员,则在某些成员函数中使用向量的本地定义。这是初学者的一般错误。
因此,您需要检查是否确实在每个操作中处理了原始向量。