排序、唯一、擦除不起作用
sort, unique, erase does not work
我有一个
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
另一个原因可能是,如果向量是类的数据成员,而不是使用该数据成员,则可以在某个成员函数中使用向量的局部定义。这是初学者的普遍错误。
因此,您需要检查在每个操作中是否确实处理了原始向量。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- C++矢量 - 放置/擦除不起作用?(多态性)
- 擦除() 不起作用C++
- C++ std::set::擦除不起作用
- 如何通过长度从 std::vector 中删除元素<string>(擦除不起作用)
- 模板类矢量擦除不起作用
- 标准::列表::擦除不起作用
- STL 矢量擦除不起作用
- 对象的 C++ 向量,包含动态分配的内存 - "擦除"不起作用
- 矢量擦除函数不起作用 c++
- 排序、唯一、擦除不起作用
- 矢量排序和擦除不起作用
- C++映射擦除(开始,结束)不起作用
- 如何删除矢量中的元素。(擦除不起作用)
- 矢量上的擦除操作不起作用
- 迭代器擦除 (迭代器在先,迭代器最后) 在 Visual C++ 2010 Express 下不起作用
- 向量::擦除在类方法中不起作用,但在 main 中工作;没有编译器错误,只有意外的结果