使用迭代器删除容器节点时的问题

最帅马老师 2010-03-01 12:57:59
现在有这样的一个需求,有一个vector,一个节点是一个类对象,对象下有一个属性名为number,现在从此vector后向前遍历删除掉前面number重复的节点,请问有没有好的方法

如有一个vector,看起来大概像这样

序号 number 其它值
1 abc 11
2 cde 22
3 abc 33
4 abc 44

现在要求从后向前遍历删除掉number重复的节点,即保留从后往前看遇到的第一个number,如上面的abc节点,只应保留第4个,1和3都应被删除,操作后这个vector应该是这样

序号 number 其它值
1 cde 22
2 abc 44


请求效率高的方法,我只有27分可用分,全部奉上。
...全文
175 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
InfidelX 2010-03-01
  • 打赏
  • 举报
回复
引用 1 楼 baihacker 的回复:
看上去num是可以排序的。
但是排序的时候要注意
1。添加一个项,表示在原始序列中的位置;
2。在按num比较相同的时候,在原始序列中的位置靠后的在前;
3。用unique算法;
4。所有元素按在原始序列中的位置排序。
算法瓶颈:字符串比较,拷贝一个元素。
另外更直接的做法是从一个set <string>表示string在原始序列中出现过。
从后往前序列序列,如果在set中找到当前的记录的num,那么当前记录的删除标记置1。
更进一步可以用hash表。
另外不要忘了拷贝一个元素的代价。
下面代码只示例sort和unique的使用,并不满足要求。
C/C++ codestruct Stu
{int id;string num;
};int cmp1(const Stu& a,const Stu& b)
{return a.num< b.num;
}int eq(const Stu& a,const Stu& b)
{return a.num== b.num;
}int main()
{
vector<Stu> vec(4);
vec[0].id=1, vec[0].num="abc";
vec[1].id=2, vec[1].num="cde";
vec[2].id=3, vec[2].num="abc";
vec[3].id=4, vec[3].num="abc";
stable_sort(vec.begin(), vec.end(), cmp1);int n= unique(vec.begin(), vec.end(), eq)- vec.begin();for (int i=0; i< n;++i) cout<< vec[i].id<<""<< vec[i].num<< endl;return0;
}

严重同意
最帅马老师 2010-03-01
  • 打赏
  • 举报
回复
不过1楼的方法很有启示
最帅马老师 2010-03-01
  • 打赏
  • 举报
回复
number不能排序,这是测试数据,必须保持数据的顺序(数据中的顺序很重要)
liuhao159753 2010-03-01
  • 打赏
  • 举报
回复
最高效的当然是STL里面的sort和unique算法,顶1楼,只是需要重写字符串的比较的仿函数
herman~~ 2010-03-01
  • 打赏
  • 举报
回复
顶一楼的方法,只需要提供排序sort还有unique函数的仿函数

另外,如果是另外开辟一个set,并提供set的比较函数,把数据往set里面写,应该也可以去除重复的记录
白云飘飘飘 2010-03-01
  • 打赏
  • 举报
回复
楼上的算法:stable_sort的最快的时间复杂度为O(NlogN),unique的时间复杂度为N,并且更改了向量原有的顺序。
我提一种算法:对向量进行遍历,把number插入到一个集合中来判断原素是否存在。遍历的复杂度为N。在集合中查找number的复杂度最坏为O(NlogN),当所有的number都一样时,复杂度为O(N)。不会改变原有的顺序。
baihacker 2010-03-01
  • 打赏
  • 举报
回复
看上去num是可以排序的。
但是排序的时候要注意
1。添加一个项,表示在原始序列中的位置;
2。在按num比较相同的时候,在原始序列中的位置靠后的在前;
3。用unique算法;
4。所有元素按在原始序列中的位置排序。
算法瓶颈:字符串比较,拷贝一个元素。
另外更直接的做法是从一个set<string>表示string在原始序列中出现过。
从后往前序列序列,如果在set中找到当前的记录的num,那么当前记录的删除标记置1。
更进一步可以用hash表。
另外不要忘了拷贝一个元素的代价。
下面代码只示例sort和unique的使用,并不满足要求。
struct Stu
{
int id;
string num;
};

int cmp1(const Stu& a, const Stu& b)
{
return a.num < b.num;
}
int eq(const Stu& a, const Stu& b)
{
return a.num == b.num;
}
int main()
{
vector<Stu> vec(4);
vec[0].id = 1, vec[0].num = "abc";
vec[1].id = 2, vec[1].num = "cde";
vec[2].id = 3, vec[2].num = "abc";
vec[3].id = 4, vec[3].num = "abc";
stable_sort(vec.begin(), vec.end(), cmp1);
int n = unique(vec.begin(), vec.end(), eq) - vec.begin();
for (int i = 0; i < n; ++i) cout << vec[i].id << " " << vec[i].num << endl;
return 0;
}

64,639

社区成员

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

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