为了账号安全,请及时绑定邮箱和手机立即绑定

我正在做扑克算法,如何用迭代器完成删除连续4个相同元素呢?请多多指教

我正在做扑克算法,如何用迭代器完成删除连续4个相同元素呢?请多多指教

翻阅古今 2023-04-22 18:14:51
void deal_value(vector<int> &dealv){for(vector<int>::size_type i=0;i<10;i++){if(dealv[i]==dealv[i+3]){cout<<"dealv[i]:"<<dealv[i]<<endl;remove(dealv.begin(),dealv.end(),dealv[i]);}}}结过出现错误:测试值:1 2 1 2 3 3 3 3 4 4dealv[i]:3结过:1 2 1 2 4 3 3 3 4 4第6位结果不正确。
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

remove不正确是因为你传入的第三个参数是接受变动的容器内部的数,这样按引用传递进来的第三个参数会在算法执行的过程中收到影响。

remove(dealv.begin(),dealv.end(),dealv[i]);
改为:
int d=dealv[i];
remove(dealv.begin(),dealv.end(),d);
即可。
或者简单点,直接将dealv[i]转换成右值:
remove(dealv.begin(),dealv.end(),(int)dealv[i]);

为什么会这样,其实本质上是当remove在删除内部元素的时候,你的dealv[i]的值不知不觉产生了改变。

查看完整回答
反对 回复 2023-04-25
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

我写的模板函数接受3个参数,前两个参数定义要搜索的区间,第三个参数决定连续多少个相同的元素,返回值是找到的第一个连续4个相同元素的起始位置和终止位置的迭代器,这两个迭代器组成一个pair对象。(根据stl惯例,这两个迭代器定义的区间是左闭右开的)把这两个迭代器送给erase函数做参数,就可以删除想删除的元素。示例如下:
===================================================
#include <iostream>
using std::cout;
using std::endl;

#include <vector>
using std::vector;

using std::pair;

template <typename InputIterator>
std::pair<InputIterator, InputIterator>
find_equal_sequence(InputIterator first, InputIterator last, int n) {
if (first != last) {
InputIterator cur(first), start(cur++);
for (int c = 1; cur != last; ++cur) {
if (*cur == *start) {
if (++c == n)
return std::make_pair(start, ++cur);
} else {
start = cur;
c = 1;
}
}

}
return std::make_pair(last, last);
}

int main() {
int array[] = { 1, 2, 1, 2, 3, 3, 3, 3, 4, 4, };
vector<int> v(array, array+10);

for (vector<int>::iterator i = v.begin(); i != v.end(); ++i)
cout << *i << " ";
cout << endl;

typedef vector<int>::iterator vi;
pair<vi, vi> range = find_equal_sequence(v.begin(), v.end(), 4);
v.erase(range.first, range.second);

for (vector<int>::iterator i = v.begin(); i != v.end(); ++i)
cout << *i << " ";
cout << endl;

return 0;
}



查看完整回答
反对 回复 2023-04-25
  • 2 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信