Chúng ta sẽ xem Output iterator trong C++. Output iterator có các thuộc tính sau:
- Output iterator dùng để sửa đổi giá trị của container.
- Không thể đọc dữ liệu từ container bằng loại iterator này.
- Là iterator một chiều (One-Way) và chỉ ghi (Write only).
- Có thể tăng (increment) nhưng không thể giảm (decrement).
- Có hai loại con: Insert Iterator và ostream iterator.
Insert Iterator
Insert iterator dùng để chèn phần tử vào container. Toán tử gán trên iterator này chèn phần tử mới tại vị trí hiện tại. Cú pháp:
template<class Container, class Iterator> insert_iterator<container> inserter(Container &x, Iterator it);
Iterator này nhận hai tham số: x là container để iterator làm việc, it là iterator object trỏ đến vị trí cần sửa đổi.
Ví dụ Code
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> vec1, vec2;
for (int i = 1; i <= 10; i++) {
vec1.push_back(i);
vec2.push_back(i + 3);
}
vector<int>::iterator it = vec1.begin();
advance(it, 5); // tiến it đến vị trí 5
copy(vec2.begin(), vec2.end(), inserter(vec1, it));
cout << "Elements of vec1 are:";
for (it = vec1.begin(); it != vec1.end(); ++it)
cout << ' ' << *it;
cout << endl;
return 0;
}
Kết quả
Elements of vec1 are: 1 2 3 4 5 4 5 6 7 8 9 10 11 12 13 6 7 8 9 10
Ostream Iterator
Ostream iterator dùng để ghi ra luồng xuất như cout. Tạo từ đối tượng basic_ostream. Khi dùng toán tử gán, nó chèn phần tử mới vào luồng xuất. Cú pháp:
template<class T, class charT=char, class traits=char_traits<charT>> class ostream_iterator;
Các hàm thành viên của lớp ostream_iterator:
ostream_iterator<T, charT, traits>& operator=(const T& value); ostream_iterator<T, charT, traits>& operator*(); ostream_iterator<T, charT, traits>& operator++(); ostream_iterator<T, charT, traits>& operator++(int);
Tham số: T - kiểu phần tử chèn, charT - kiểu ký tự ostream xử lý, traits - đặc tính ký tự luồng xử lý.
Ví dụ Code
#include <iostream>
#include<iterator>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
vector<int> vec;
for(int i = 1; i <= 10; i++)
vec.push_back(i * i); // bình phương và chèn
ostream_iterator<int> out(cout, ",");
copy(vec.begin(), vec.end(), out);
}
Kết quả
1,4,9,16,25,36,49,64,81,100,
Ví dụ khác:
Ví dụ Code
#include <iostream>
#include<iterator>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
ostream_iterator<int> os_out(cout, ",");
*os_out = 10;
os_out++; // trỏ tiếp
*os_out = 20;
os_out++;
*os_out = 30;
}
Kết quả
10,20,30,