std::erase 和 std::remove 删除特定元素的组合不适用于特定示例
std::erase and std::remove combination to delete specific element doesn't work for specific example
#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 7.7.1 在 return 1 行指出:
a = {2,3,7,1,5,4} 这不是预期的(只删除一个 1),并且
b = {7,4,3,3,1} 这不是预期的。
我的期望是 b 应该是 a=2,3,7,5,4 和 b=7,4,3,3,1,7。
这里发生了什么?
std::remove()
的声明看起来像
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
注意最后一个参数是引用。因此在编译后它有效地传递了指定元素的地址。
通过remove(a.begin(), a.end(), a[0])
,传入了一些表示a
的第0个元素的地址的东西。当remove()
为运行时,一旦第0个元素被处理,传入的引用指向的值改变了,导致了意想不到的结果。
要获得预期结果,请在调用 std::remove()
之前复制一份。
int toberemoved = a[0];
a.erase(remove(a.begin(),a.end(),toberemoved),a.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 7.7.1 在 return 1 行指出: a = {2,3,7,1,5,4} 这不是预期的(只删除一个 1),并且 b = {7,4,3,3,1} 这不是预期的。
我的期望是 b 应该是 a=2,3,7,5,4 和 b=7,4,3,3,1,7。
这里发生了什么?
std::remove()
的声明看起来像
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
注意最后一个参数是引用。因此在编译后它有效地传递了指定元素的地址。
通过remove(a.begin(), a.end(), a[0])
,传入了一些表示a
的第0个元素的地址的东西。当remove()
为运行时,一旦第0个元素被处理,传入的引用指向的值改变了,导致了意想不到的结果。
要获得预期结果,请在调用 std::remove()
之前复制一份。
int toberemoved = a[0];
a.erase(remove(a.begin(),a.end(),toberemoved),a.end());