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