*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";
}