Tiêu chuẩn không hoàn toàn đánh vần nó, nhưng v.erase(q)
được xác định, "Xoá phần tử được trỏ đến bởi q
" trong [sequence.reqmts]
. Điều này có nghĩa là q
phải thực sự trỏ đến một phần tử, mà trình lặp kết thúc không. Đi qua trong vòng lặp kết thúc là hành vi không xác định.
Thật không may, bạn cần phải viết:
auto it = std::find(...);
if (it != <the part of ... that specifies the end of the range searched>) {
v.erase(it);
}
Tất nhiên, bạn có thể định nghĩa:
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()
trên lợi nhuận chứa kết void
, vì vậy để khái quát mẫu này để tất cả các container bạn cần một số hành động -> decltype
.
Nguồn
2012-03-06 19:11:47
+1 để tham khảo chuẩn. –
[docs] (http://www.cplusplus.com/reference/vector/vector/erase/) nói rằng "xoá các phần tử ở các vị trí khác với đầu cuối vector làm cho vùng chứa phải di chuyển ...". Dường như xuất hiện kết thúc() làm tham số. Và không nơi nào nói ngược lại một cách rõ ràng. Tôi không thích điều này ... – Pavel
@Pavel: sau đó bạn sẽ phải đưa nó lên với các tác giả của "cplusplus.com". Nó là * không * tài liệu C++, tiêu chuẩn là tài liệu C++. Nhưng nó định nghĩa 'vị trí' là" Iterator trỏ đến một phần tử duy nhất ". Trình lặp kết thúc không trỏ đến một phần tử đơn lẻ. –