C++ 向量";抹去;及;at";产生错误(c+;+;)
我使用提供的算法来打印重复的元素C++ 向量";抹去;及;at";产生错误(c+;+;),c++,vector,C++,Vector,我使用提供的算法来打印重复的元素 #include <random> #include <algorithm> #include <iterator> #include <iostream> using namespace std; /*Complexity: O(n log n). You sort once, then you iterate once*/ vo
#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>
using namespace std;
/*Complexity: O(n log n). You sort once, then you iterate once*/
void function_1(std::vector<int> t)
{
cout << "The duplicate elements are: \n";
std::sort(t.begin(), t.end());
for(int i = 0; i < t.size() - 1; i++)
{
if (t[i] == t[i + 1])
{
t.erase(t.at(i));
i--;
}
}
}
int main()
{
std::vector<int> test{1,2,1,3,2,4};
function_1(test);
return 0;
}
我不明白为什么我会犯上述错误
谢谢
std::vector::erase
需要一个迭代器到达您希望擦除的位置。你;重新提供对存储值的引用
你可以改为:
t.erase(std::next(t.begin(), i));
std::vector::erase
需要一个迭代器到达要擦除的位置。你;重新提供对存储值的引用
你可以改为:
t.erase(std::next(t.begin(), i));
vector::erase需要迭代器,而不是元素类型,因此您应该更改:
t.erase(t.at(i));
到
要使其编译,vector::erase需要迭代器,而不是元素类型,因此您应该更改:
t.erase(t.at(i));
到
要使其编译需要什么类型的参数?您是否阅读了
vector
的文档?注意:有符号无符号问题:`i+1i。但是,考虑一个未签名的I.@ OP FIY,<代码> test .擦除(STD::Stime:Test.Orth.,test .Enter()),Test.Enter());代码>从排序向量中删除重复项。为了清楚起见,从链接问题的答案中复制的代码中的擦除位完全错误。您确定此算法为O(n log n)吗?在最坏的情况下(所有重复),您将在排序和迭代的基础上重复擦除和洗牌向量中的所有元素。不过,我想知道该场景在排序阶段所承受的负担是否会以某种方式分摊到洗牌中?需要什么类型的参数?您是否阅读了vector
的文档?注意:有符号无符号问题:`i+1i。但是,考虑一个未签名的I.@ OP FIY,<代码> test .擦除(STD::Stime:Test.Orth.,test .Enter()),Test.Enter());代码>从排序向量中删除重复项。为了清楚起见,从链接问题的答案中复制的代码中的擦除位完全错误。您确定此算法为O(n log n)吗?在最坏的情况下(所有重复),您将在排序和迭代的基础上重复擦除和洗牌向量中的所有元素。不过,我想知道,这种情况在排序阶段所承受的负担是否会以某种方式分摊到洗牌过程中?@Smeeheey仍然不起作用<代码>标准::高级
返回无效
。您想要的是std::next
。是的,再次正确,甚至正确better@Smeeheey还是不行<代码>标准::高级
返回无效
。您想要的是std::next
。是的,再次正确,甚至更好