我正在从事一项家庭作业项目,并且坚持使用此功能。我需要使用<vector>
和<set>
解决问题两次。我们只需要从作为参数传递的向量中消除重复元素即可。
这是我的第一次尝试。
vector<int> erase_repeating_elem(vector<int> s) {
int len = s.size();
for (int i = 0; i < len -1; i++) {
for (int j = i + 1; i < len; j++) {
if (s[i] == s[j]){
s.erase (s.begin()+j);
len--;
}
}
}
return s;
}
main(){
vector<int> s = {1, 1, 2, 2, 3, 3};
s = erase_repeating_elem(s);
std::cout << "myvector contains:";
for (unsigned i=0; i<s.size(); ++i)
std::cout << ' ' << s[i];
std::cout << '\n';
return 0;
}
当我尝试运行它时,我得到了:Process returned -1073741819 <0xC0000005>
我认为删除向量元素可能是内存问题,因为我不知道是否再次计算s.size()
。所以我尝试了这个:
vector<int> erase_repeating_elem(vector<int> s) {
int len = s.size();
for (int i = 0; i < len -1; i++) {
for (int j = i + 1; i < len; j++) {
if (s[i] == s[j]){
s.erase (s.begin()+j);
len--;
}
}
}
return s;
}
我得到相同的错误代码。我正在考虑解决此问题的其他方法,例如将重复的元素交换到向量的后面,然后仅使用pop_back()
。但是我认为我的解决方案(如果可行)会更好。
我在Code :: Blocks上使用cygwin工具链,但是我无法使调试器运行。有什么提示吗?
此外,在<set>
情况下,正确的处理方式是什么?我猜只是将元素添加到新集中,让它自己照顾重复的元素。
谢谢。
答案 0 :(得分:0)
In this loop for (int j = i + 1; i < len; j++) in the condition there is used the variable i instead of j. – Vlad from Moscow 2 mins ago
来自莫斯科的弗拉德(Vlad)发现了我的愚蠢错误。