vector::erase(删除(....)) 不工作
vector::erase(remove(....)) is not working
我想出了一个方案
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> a = {1,2,3,7,1,5,4};
vector<int> b = {6,7,4,3,3,1,7};
a.erase(remove(a.begin(),a.end(),a[0]),a.end());
b.erase(remove(b.begin(),b.end(),b[0]),b.end());
return 1;
}
对于这个具体示例,我的 GNU gdb Ubuntu 声明在 return 1
行:a = {2,3,7,1,5,4}
这不是预期的(只删除一个 1
),并且 b = {7,4,3,3,1}
这不是预期的。
我的期望是 a
和 b
应该是 a=2,3,7,5,4
和 b=7,4,3,3,1,7
。
这是怎么回事?
std::remove
通过引用获取第三个参数,并使对其工作范围内的引用无效(从某种意义上说,它会移动内容,从而更改范围内元素的值)。问题是您在调用期间更改了引用参数 a[0]
,这是您绝对不能做的。
要解决此问题,请传递一个副本:
a.erase(remove(a.begin(),a.end(),int{a[0]}),a.end());
或者,更改
a.erase(remove(a.begin(), a.end(), 1), a.end());
b.erase(remove(b.begin(), b.end(), 6), b.end());
我想出了一个方案
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> a = {1,2,3,7,1,5,4};
vector<int> b = {6,7,4,3,3,1,7};
a.erase(remove(a.begin(),a.end(),a[0]),a.end());
b.erase(remove(b.begin(),b.end(),b[0]),b.end());
return 1;
}
对于这个具体示例,我的 GNU gdb Ubuntu 声明在 return 1
行:a = {2,3,7,1,5,4}
这不是预期的(只删除一个 1
),并且 b = {7,4,3,3,1}
这不是预期的。
我的期望是 a
和 b
应该是 a=2,3,7,5,4
和 b=7,4,3,3,1,7
。
这是怎么回事?
std::remove
通过引用获取第三个参数,并使对其工作范围内的引用无效(从某种意义上说,它会移动内容,从而更改范围内元素的值)。问题是您在调用期间更改了引用参数 a[0]
,这是您绝对不能做的。
要解决此问题,请传递一个副本:
a.erase(remove(a.begin(),a.end(),int{a[0]}),a.end());
或者,更改
a.erase(remove(a.begin(), a.end(), 1), a.end());
b.erase(remove(b.begin(), b.end(), 6), b.end());