删除Vector中重复的数据

xiekeliangjian 2014-10-28 06:47:47
#include <iostream>
#pragma warning(disable : 4786)
#include <string>
#include <vector>

using namespace std;

struct Data
{
string s;
int number;
};

void main()
{
vector<Data> m_data;
Data temp;
temp.s = "1234";
temp.number = 1;
m_data.push_back(temp);
temp.s = "12C7";
temp.number = 2;
m_data.push_back(temp);
temp.s = "123F";
temp.number = 3;
m_data.push_back(temp);
temp.s = "1234";
temp.number = 4;
m_data.push_back(temp);

return;
}

需求:删除vector中重复的's'数据(删除先出现的,即删除1234 1 这条记录),请问大神们有什么方便的办法呢?
...全文
360 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2014-10-30
  • 打赏
  • 举报
回复
引用 1 楼 lovesmiles 的回复:
简单,不考虑时间效率的话,用二个for循环迭代对比所以元素,将后面重复出现的全部删除
如果有多个重复的呢?只留下最后的吗?

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

using namespace std;

struct Data {
    string s;
    int number;
};

bool
pred(const Data &a)
{
}

int 
main()
{
    vector<Data>m_data;
    vector<Data>::iterator it1, it2;
    vector<Data>::const_iterator it;
    Data temp;
    bool flag;

    temp.s = "1234";
    temp.number = 1;
    m_data.push_back(temp);

    temp.s = "12C7";
    temp.number = 2;
    m_data.push_back(temp);

    temp.s = "123F";
    temp.number = 3;
    m_data.push_back(temp);

    temp.s = "1234";
    temp.number = 4;
    m_data.push_back(temp);

    temp.s = "1234";
    temp.number = 5;
    m_data.push_back(temp);

    temp.s = "123F";
    temp.number = 6;
    m_data.push_back(temp);


    for (it = m_data.begin(); it != m_data.end(); ++it) {
        cout << it->s << ',' << it->number << endl;
    }
    cout << endl;

    for (it1 = m_data.begin(); it1 != m_data.end(); ) {
        flag = false;
        it2 = it1;
        advance(it2, 1);
        for ( ; it2 != m_data.end(); ++it2) {
            if (it2->s == it1->s) {
                flag = true;
                it1 = m_data.erase(it1);
                break;
            }
        }
        if (!flag) {
            ++it1;
        }
    }

    for (it = m_data.begin(); it != m_data.end(); ++it) {
        cout << it->s << ',' << it->number << endl;
    }
    cout << endl;

    return 0;
}
jinlian_152 2014-10-30
  • 打赏
  • 举报
回复
c++ primer 上貌似有个例子,用6楼那几个函数。
li4c 2014-10-29
  • 打赏
  • 举报
回复
6楼正解
ri_aje 2014-10-29
  • 打赏
  • 举报
回复
sort, unique, erase
漂浮一生 2014-10-29
  • 打赏
  • 举报
回复
直接用map就好啦,你可以这样 map<string, int>; 将m_data中元素从末尾依次插入到map<string, int>中,最后一次出现的自然就先存起来了,在之前出现的就不会放进去了,再将 map<string, int>中元素取出来放回去,就是结果
mujiok2003 2014-10-29
  • 打赏
  • 举报
回复
zybjtu 2014-10-29
  • 打赏
  • 举报
回复
看看std::unique. http://www.cplusplus.com/reference/algorithm/unique/?kw=unique
leftbackfielder 2014-10-29
  • 打赏
  • 举报
回复
如果只是这种数据结构的话,是否可以考虑下用map
我叫小菜菜 2014-10-29
  • 打赏
  • 举报
回复
引用 1 楼 lovesmiles 的回复:
简单,不考虑时间效率的话,用二个for循环迭代对比所以元素,将后面重复出现的全部删除
这是一个好办法~~ 其他的办法,比如排序后判断连续重复的删掉、使用集合set保证不重复等等,视实际情况而定。
_不羁的风 2014-10-29
  • 打赏
  • 举报
回复
7楼正解~~~~~~~
勤奋的小游侠 2014-10-28
  • 打赏
  • 举报
回复
简单,不考虑时间效率的话,用二个for循环迭代对比所以元素,将后面重复出现的全部删除

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧