当我使用以下代码时,它能正常工作(什么也不做)吗?
vector<T> v;
v.erase(v.end());
我想使用类似于以下的内容:
v.erase(std::find(...));
我应该检查v.end()
是否为空吗?
在C++.com和CPPreference上都没有相关信息。
当我使用以下代码时,它能正常工作(什么也不做)吗?
vector<T> v;
v.erase(v.end());
我想使用类似于以下的内容:
v.erase(std::find(...));
我应该检查v.end()
是否为空吗?
在C++.com和CPPreference上都没有相关信息。
标准没有详细说明,但在[sequence.reqmts]
中定义了v.erase(q)
,“删除由q
指向的元素”这意味着q
必须实际上指向一个元素,而末尾迭代器则不是。将末尾迭代器传入是未定义行为。
不幸的是,你需要编写:
auto it = std::find(...);
if (it != <the part of ... that specifies the end of the range searched>) {
v.erase(it);
}
当然,你可以定义:template typename<Sequence, Iterator>
Iterator my_erase(Sequence &s, Iterator it) {
if (it == s.end()) return it;
return s.erase(it);
}
my_erase(v, std::find(v.begin(), v.end(), whatever));
c.erase()
在关联容器中返回 void
,所以要将这个模板推广到所有容器,你需要一些 -> decltype
操作。
删除end()
函数(或查看end()
函数的目标)都是未定义的行为。未定义的行为允许具有任何行为,包括在您的平台上“有效运行”。这并不意味着您应该这样做;这仍然是未定义的行为,在以后的某个时候我会以最糟糕的方式咬你。
根据您的目的,您可能希望考虑使用set
或unordered_set
而不是vector
。
end-1
" 才能起作用,这与 "pop_back" 相同。 - Billy ONeal你尝试过这个吗?
v.erase(remove_if(v.begin(), v.end(), (<your criteria>)), v.end());
vec.erase(vec.end())
明显不是。 - bobobobo
position
定义为“指向单个元素的迭代器”。结束迭代器并不指向单个元素。 - Steve Jessopend() - 1
而不是“vector end”。 - emlai