container::iterator iter
container에 접근하여 요소를 순회하는데 사용하는 포인터와 같은 객체이다.
iterator를 이용해 저장/삭제/탐색을 할 수 있다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v{0, 1, 2, 3};
vector<int>::iterator iter = v.begin();
iter[3] = 30;
cout << *iter << endl;
cout << *(iter + 1) << endl;
cout << iter[2] << endl;
cout << v[3] << endl;
}
실행 결과
0
1
2
30
#include <iostream>
#include <vector>
using namespace std;
int main() {
template<typename TIterator, typename T>
bool has(TIterator begin, TIterator end, T value) {
for (auto iter = begin; iter != end; iter++) {
if (*iter == value)
return true;
}
return false;
}
// template을 이용한 추상화
int main() {
cout << boolalpha;
vector<int> v{ 1, 2, 3 };
vector<string> v1{ "1", "2", "3" };
cout << has(v.begin(), v.end(), 2) << endl;
cout << has(v.begin(), v.end(), 4) << endl;
cout << has(v1.begin(), v1.end(), "1") << endl;
cout << has(v1.begin(), v1.end(), "5") << endl;
}
실행 결과
true
false
true
false
typename TIterator가 it
<container>::const_iterator citer
const 성질을 지닌 iterator
vector.begin()
, vector.end()
는 받지 못하고
vector.cbegin()
, vector.cend()
등 각각 container에 있는 멤버함수로 받을 수 있다.
container로부터 값을 읽는 데 사용되며 프로그램이 그 값을 변경할 수는 없다.
++
연산자를 이용해 순방향으로만 이동할 수 있다.*
참조 연산자를 이용해 반복해서 같은 요소에 쓰기 가능.std::cin
등이 해당된다.#include <iostream>
#include <fstream>
using namespace std;
void istreamIter(std::istream& is) {
std::istream_iterator<int> iter(is);
auto value = *iter++;
// *iter를 읽고 value에 입력
cout << value << endl;
//후 출력
value = *iter++;
cout << value << endl;
value = *iter++;
cout << value << endl;
value = *iter++;
cout << value << endl;
}
int main() {
std::ifstream ifs("output.txt");
istreamIter(cin);
}
실행 결과
output.txt를 읽어 출력해준다.
container의 값을 변경하는데 사용되며 프로그램에서 값을 읽을 수 없다.
++
연산자를 이용해 순방향으로만 이동할 수 있다.*
참조 연산자를 이용해 단 한번만 요소 참조 가능.std::cout
등이 해당된다.#include <iostream>
#include <fstream>
using namespace std;
void ostreamIter(std::ostream& os) {
ostream_iterator<int> iter(os, " ");
*iter = 1;
*iter++;
*iter = 2;
*iter = 3;
*iter = 3;
}
int main() {
std::ofstream ofs("output.txt");
ostreamIter(cout);
}
실행 결과
output.txt에 1 2 3 3을 쓴다.
입출력이 모두 가능한 반복자이다.
++
연산자를 이용해 순방향으로만 이동할 수 있다.*
참조 연산자를 이용해 반복해서 같은 요소 참조 가능.std::forward_list
, unordered_<container>
등이 해당된다.예외
nordered_set
등의 unordered container는 forward iterator이지만 C++ 17이상부터 bidirectional iterator를 지원한다.
입출력이 모두 가능한 반복자이다.
++
연산자와 --
연산자를 이용해 순방향, 역방향 모두 이동할 수 있다.*
참조 연산자를 이용해 반복해서 같은 요소 참조 가능.std::list
, std::set
, std::map
, std::multiset
, std::multimap
등이 해당된다.양방향 반복자의 모든 기능을 포함하며 첨자연산을 이용해 임의의 요소에 접근 가능하다.
++
연산자와 --
연산자를 이용해 순방향, 역방향 모두 이동할 수 있다.+
연산자, -
연산자를 이용해 값을 더하거나 뺄 수 있다.*
참조 연산자를 이용해 반복해서 같은 요소 참조 가능.std::vector
, std::array
, std::deque
등이 해당된다.random access iterator의 모든 기능을 포함하며 물리적 매모리가 연속적으로 이루어져있다.
C++ 20 이상부터 지원가능
++
연산자와 --
연산자를 이용해 순방향, 역방향 모두 이동할 수 있다.+
연산자, -
연산자를 이용해 값을 더하거나 뺄 수 있다.*
참조 연산자를 이용해 반복해서 같은 요소 참조 가능.std::vector
, std::array
, 등이 해당된다.
deque
는deque.push_front
등의 동작으로 배열이 연속적이지 않기 때문에 포함되지 않는다.