output của set_union
và set_intersection
sẽ được tham số thứ 5 output_iter
trong 2 hàm này lưu lại. Code lưu lại có thể được viết là:
*output_iter = result;
++output_iter;
ví dụ 1 hàm myMerge
viết thế này:
// hàm này đơn giản là copy "mảng" 1 vào output rồi copy "mảng" 2 vào output
template <typename ForwardIter1, typename ForwardIter2, typename OutputIter>
void myMerge(ForwardIter1 first1, ForwardIter1 last1, ForwardIter2 first2,
ForwardIter2 last2, OutputIter outIter) {
// copy [first1, last1) to outIter
for (; first1 != last1; ++first1, ++outIter) *outIter = *first1;
// viết "khó hiểu" hơn 1 tí nhưng đẹp hơn:
// while (first1 != last1) *outIter++ = *first1++;
// copy [first2, last2) to outIter
for (; first2 != last2; ++first2, ++outIter) *outIter = *first2;
}
nếu tham số thứ 5 đó là con trỏ hoặc iterator thì nó code trên chạy vô tư, nhưng vì ko biết trước sẽ có bao nhiêu kết quả nên phải xài vector::push_back
, mà code trên ko có xài push_back. Vậy ta phải nhờ 1 class trung gian quá tải toán tử =
, *
(indirection, ko phải phép nhân) và ++
gọi là back_insert_iterator: *
chả làm gì cả, trả về chính nó, ++
cũng chả làm gì, chỉ có =
là gọi container.push_back(result)
.
std::back_inserter(container)
là 1 hàm để tạo back_insert_iterator
này, tên ngắn hơn :V