[C++, STL] set 원소 iterator 없이 출력(range-based for loop)

*Range-Based for Loop 가 필요해서 C++11 이상에서 동작합니다.

iterator 선언 set원소 출력 방법

std::set<int>s;

for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
	std::cout << *it << " ";
}

iterator 미선언 set원소 출력 방법

std::set<int>s;

for (auto i : s) std::cout << i << " ";
#include <set>
#include <iostream>

using namespace std;

int main() {
	std::set<int>s;

	s.insert(1);
	s.insert(2);
	s.insert(3);

	for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
		cout << *it << " ";
	}
	// 출력결과 :  1 2 3

	cout << endl;

	for (auto i : s) cout << i << " ";
	// 출력결과 :  1 2 3
}

범위기반 for문에선 iterator를 선언하지 않아도 참조가 가능한데, 이유는 모르겠습니다. 공부가 더 필요합니다.컴파일러는 msvc, gcc에서 동작하는것을 확인했습니다. 그리고 iterator, range based for loop, 벡터의 수행시간을 각각 확인해봤는데 약 백만개를 참조했을때 아래의 결과가 나왔습니다.

  • iterator 사용시는 약 1300ms
  • range based for loop 사용시는 약 140ms

range based for loop의 벡터 사용시는 약 2ms로 차이를 보입니다.

그래서 set을 range based for loop를 사용했을때 벡터의 사용시간보다 긴것을 보아 랜덤엑세스가 아닌 다른 방법을 쓴것 같은데, 어쨌든 iterator 사용보다 빠르고 편한것 같습니다.

// 수행시간 측정

#include <set>
#include <iostream>
#include <ctime>
#include <vector>

using namespace std;

int main() {
	clock_t begin, end;
	set<int>s;
	vector<int>v;
	for (int i = 0; i < 1000000; i++) {
		s.insert(i);
		v.push_back(i);
	}
	// iterator
	begin = clock();
	for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
		//cout << *it << " ";
	}
	end = clock();
	cout <<"iterator : "<< (end - begin)<<"ms";
	cout << endl;

	// range based for loop
	begin = clock();
	for (auto i : s) {
		//cout << i << " ";
	}
	end = clock();
	cout << "range based : " << (end - begin) << "ms";
	cout << endl;

	begin = clock();
	for (auto i : v) {
		//cout << i << " ";
	}
	end = clock();
	cout << "vector : " << (end - begin) << "ms";
}

Leave a Comment