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]的值不知不覺產生了改變。

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;
}
添加回答
舉報