注册 登录
编程论坛 C++教室

矢量删除操作

王翔 发布于 2015-03-09 12:07, 521 次点击
void del(vector<int> & st)
{
    auto pr = st.begin(), tp = pr;        
    for (; pr != st.end(); pr++)
        for (tp = pr + 1; tp != st.end(); tp++)
            if (*tp == *pr)
                st.erase(tp, tp + 1);
}
int main()
    {
        ........
        vector<int> s = { 35, 46, 57, 13, 24, 35, 68, 13, 79, 88, 46 };
        del(s);
        .........
    }

这是我写的一个函数,用来删除矢量中重复的数字,调试时发现,删除第一个重复的数字就出错了,求帮忙!
9 回复
#2
TonyDeng2015-03-09 12:10
給你一個建議:不用刪,複製一個新vector即可。
#3
zklhp2015-03-09 12:26
排序 删掉重复的

程序代码:
// g++ -Wall -fomit-frame-pointer -funroll-loops -Ofast -march=corei7-avx -msse4.2 -mavx -std=c++11 del_dup.cpp -lm -o del_dup
#include <iostream>
#include <vector>
#include <algorithm>

using std::cout;
using std::endl;
using std::vector;
using std::sort;
using std::unique;

int main(void)
{
    vector<int> s = {35, 46, 57, 13, 24, 35, 68, 13, 79, 88, 46};
    for (auto i : s)
        cout << i << ' ';
    cout << endl;
    sort(s.begin(), s.end());
    s.erase(unique(s.begin(), s.end()), s.end());
    for (auto i : s)
        cout << i << ' ';
    cout << endl;
   
    return 0;
}


既然你用了C++11 我也用

[ 本帖最后由 zklhp 于 2015-3-9 12:28 编辑 ]
#4
TonyDeng2015-03-09 12:36
容量大的時候,需要考慮時空消耗。
#5
rjsp2015-03-09 15:56
程序代码:
#include <vector>
using namespace std;

void del( vector<int>& st )
{
    for( auto pr=st.begin(); pr!=st.end(); ++pr )
    {
        for( auto tp=pr+1; tp!=st.end(); )
        {
            if( *tp == *pr )
                tp = st.erase( tp );
            else
                ++tp;
        }
    }
}

int main( void )
{
    vector<int> s = { 35, 46, 57, 13, 24, 35, 68, 13, 79, 88, 46 };
    del( s );

    return 0;
}
#6
王翔2015-03-09 16:23
回复 5楼 rjsp
谢谢,再问一下,为什么要用   tp=st.erase(tp)   
#7
wmf20142015-03-09 16:33
没学,不知道矢量类型有何用。
#8
TonyDeng2015-03-09 20:53
以下是引用wmf2014在2015-3-9 16:33:09的发言:

没学,不知道矢量类型有何用。

矢量(vector),是C++標準庫中取代C數組的數據結構,一般不再用數組的了。vector,其實是取“一維數組”的意思,一維數軸常常用於表示向量或矢量。vector是C++中真正的動態數組,不用C99的VLA那樣的。


[ 本帖最后由 TonyDeng 于 2015-3-9 21:26 编辑 ]
#9
wmf20142015-03-09 21:22
回复 8楼 TonyDeng
嗯,谢了!待我找找相关资料,练习练习。
#10
zcdjt2015-03-10 22:38
回复 6楼 王翔
erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被
 
删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方
式,但是erase的返回值为下一个有效的迭代器
在网上看的,希望对你有帮助。
1