C++ STL - iterator

진경천·2024년 3월 12일
0

C++

목록 보기
80/90

iterator

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

template을 활용한 예제

#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

const_iterator

<container>::const_iterator citer
const 성질을 지닌 iterator
vector.begin(), vector.end()는 받지 못하고
vector.cbegin(), vector.cend() 등 각각 container에 있는 멤버함수로 받을 수 있다.

input iterator

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를 읽어 출력해준다.

output iterator

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을 쓴다.

forward iterator

입출력이 모두 가능한 반복자이다.

  • ++연산자를 이용해 순방향으로만 이동할 수 있다.
  • *참조 연산자를 이용해 반복해서 같은 요소 참조 가능.
  • std::forward_list, unordered_<container> 등이 해당된다.

예외

nordered_set 등의 unordered container는 forward iterator이지만 C++ 17이상부터 bidirectional iterator를 지원한다.

bidirectional iterator

입출력이 모두 가능한 반복자이다.

  • ++연산자와 --연산자를 이용해 순방향, 역방향 모두 이동할 수 있다.
  • *참조 연산자를 이용해 반복해서 같은 요소 참조 가능.
  • std::list, std::set, std::map, std::multiset, std::multimap 등이 해당된다.

random access iterator

양방향 반복자의 모든 기능을 포함하며 첨자연산을 이용해 임의의 요소에 접근 가능하다.

  • ++연산자와 --연산자를 이용해 순방향, 역방향 모두 이동할 수 있다.
  • +연산자, -연산자를 이용해 값을 더하거나 뺄 수 있다.
  • *참조 연산자를 이용해 반복해서 같은 요소 참조 가능.
  • std::vector, std::array, std::deque 등이 해당된다.

contigous access iterator

random access iterator의 모든 기능을 포함하며 물리적 매모리가 연속적으로 이루어져있다.
C++ 20 이상부터 지원가능

  • ++연산자와 --연산자를 이용해 순방향, 역방향 모두 이동할 수 있다.
  • +연산자, -연산자를 이용해 값을 더하거나 뺄 수 있다.
  • *참조 연산자를 이용해 반복해서 같은 요소 참조 가능.
  • std::vector, std::array, 등이 해당된다.

dequedeque.push_front 등의 동작으로 배열이 연속적이지 않기 때문에 포함되지 않는다.

profile
어중이떠중이

0개의 댓글