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