Nó có lẽ là đáng nói thêm rằng một iterator chèn dưới mọi hình thức ( std::back_insert_iterator
, std::front_insert_iterator
, std::insert_iterator
) đảm bảo sẽ vẫn có hiệu lực miễn là tất cả chèn được thực hiện thông qua iterator này và không có sự kiện iterator-hủy bỏ hiệu lực độc lập khác xảy ra.
Ví dụ, khi bạn đang thực hiện một loạt các thao tác chèn vào std::vector
bằng cách sử dụng std::insert_iterator
, rất có thể các phần chèn này sẽ kích hoạt phân bổ lại vectơ, điều này sẽ làm mất hiệu lực tất cả các trình vòng lặp "trỏ" vào vectơ đó. Tuy nhiên, trình lặp chèn trong câu hỏi được đảm bảo vẫn còn hiệu lực, tức là bạn có thể tiếp tục một cách an toàn trình tự chèn. Không cần phải lo lắng về việc kích hoạt phân bổ lại vector.
Điều này, một lần nữa, chỉ áp dụng cho các phần chèn thêm được thực hiện thông qua chính trình lặp chèn. Nếu sự kiện vô hiệu hóa trình lặp được kích hoạt bởi một số hành động độc lập trên vùng chứa, thì trình lặp lặp chèn cũng trở nên vô hiệu theo các quy tắc chung.
Ví dụ: mã này
std::vector<int> v(10);
std::vector<int>::iterator it = v.begin() + 5;
std::insert_iterator<std::vector<int> > it_ins(v, it);
for (unsigned n = 20; n > 0; --n)
*it_ins++ = rand();
được đảm bảo thực hiện một chuỗi chèn hợp lệ vào vectơ, ngay cả khi vectơ "quyết định" phân bổ lại ở đâu đó ở giữa quá trình này. Iterator it
rõ ràng sẽ trở thành không hợp lệ, nhưng it_ins
sẽ tiếp tục duy trì hiệu lực.