| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 521 人关注过本帖
标题:矢量删除操作
只看楼主 加入收藏
王翔
Rank: 2
等 级:论坛游民
帖 子:13
专家分:12
注 册:2015-2-1
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:9 
矢量删除操作
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);
        .........
    }

这是我写的一个函数,用来删除矢量中重复的数字,调试时发现,删除第一个重复的数字就出错了,求帮忙!
2015-03-09 12:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
給你一個建議:不用刪,複製一個新vector即可。

授人以渔,不授人以鱼。
2015-03-09 12:10
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:2 
排序 删掉重复的

程序代码:
// 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 编辑 ]
2015-03-09 12:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
容量大的時候,需要考慮時空消耗。

授人以渔,不授人以鱼。
2015-03-09 12:36
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9032
专家分:54061
注 册:2011-1-18
收藏
得分:2 
程序代码:
#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;
}
2015-03-09 15:56
王翔
Rank: 2
等 级:论坛游民
帖 子:13
专家分:12
注 册:2015-2-1
收藏
得分:0 
回复 5楼 rjsp
谢谢,再问一下,为什么要用   tp=st.erase(tp)   
2015-03-09 16:23
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:2 
没学,不知道矢量类型有何用。

能编个毛线衣吗?
2015-03-09 16:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用wmf2014在2015-3-9 16:33:09的发言:

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

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


[ 本帖最后由 TonyDeng 于 2015-3-9 21:26 编辑 ]

授人以渔,不授人以鱼。
2015-03-09 20:53
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 8楼 TonyDeng
嗯,谢了!待我找找相关资料,练习练习。

能编个毛线衣吗?
2015-03-09 21:22
zcdjt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:99
专家分:181
注 册:2014-9-9
收藏
得分:2 
回复 6楼 王翔
erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被
 
删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方
式,但是erase的返回值为下一个有效的迭代器
在网上看的,希望对你有帮助。

今朝醉
2015-03-10 22:38
快速回复:矢量删除操作
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018538 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved