基本功能可从向量中删除重复元素

时间:2019-08-22 11:25:22

标签: c++ vector set codeblocks

我正在从事一项家庭作业项目,并且坚持使用此功能。我需要使用<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>情况下,正确的处理方式是什么?我猜只是将元素添加到新集中,让它自己照顾重复的元素。

谢谢。

1 个答案:

答案 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)发现了我的愚蠢错误。