티스토리 뷰
최근에 재밌는 문제들을 몇개 풀다보니 set을 많이 사용하게 됐고, 쓴 김에 정리해두려 합니다.
set Class
https://msdn.microsoft.com/en-us/library/e8wh7665.aspx
- Set은 unique한 데이터들을 저장하고 불러낼 수 있는 container class입니다. 여기서 unique하다는 것은 데이터 간 중복이 없다는 뜻입니다.
- Set 내부에서 데이터는 자동으로 정렬됩니다.
- Set에서의 key는 value와 같습니다.
- Set에 저장된 값을 바로 수정할 수 없습니다. 기존 값을 지우고 새로운 값을 넣어야 합니다.
- Set에 저장된 데이터 접근은 iterator를 통해 할 수 있습니다.
- Set은 template class라 할 수도 있습니다. Set의 기능이 데이터 타입에 독립적이기 때문입니다.
- Set의 key와 value를 분리하고 싶다면 map을 사용하는 것이 좋습니다.
- Set의 key들이 unique하지 않기를 원하면, multimap을 사용하는 것이 좋습니다.
간단한 예제를 써봤습니다.
새로운 값 추가, 검색, 삭제하는 예제입니다 :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include <iostream> #include <string> #include <set> using namespace std; int main() { // Set Example: String key-value의 Set set<string> strSet; strSet.insert("Hello"); // strSet: [Hello] strSet.insert("I'm"); // strSet: [Hello], [I'm] strSet.insert("Summer"); // strSet: [Hello], [I'm], [Summer] strSet.insert("I'm"); // strSet: [Hello], [I'm], [Summer] 중복 X // 1. Set value에 접근 for(auto iter = strSet.begin(); iter != strSet.end(); iter++) { cout << *iter << " "; // iter는 해당 원소의 pointer를 가져온다 } cout << endl; // 출력 결과: Hello I'm Summer // 2. 원소 find / erase set<string>::iterator iter = strSet.find("I'm"); if(iter == strSet.end()) { cout << "Cannot find it" << endl; } else { cout << "Find it!" << endl; strSet.erase(iter); // 일치하는 Value가 있으면 지우라고 해봅니다. } // 3. 다시 출력! for(auto iter = strSet.begin(); iter != strSet.end(); iter++) { cout << *iter << " "; } cout << endl; // 출력 결과: Hello Summer return 0; } | cs |
msdn set 설명을 보시면 더욱 많은 함수 설명이 잘 되어있습니다. 짱!
오늘도 set에 대한 포스팅을 하다가 auto와 범위기반 for문에 대해 새로 알게되었습니다.
하나를 찾으면 다른 궁금한게 또 생기고, 이거 뭔가.. 한 노드에 접근하면 자동으로 다음에 연결된 노드가 생기는 리스트같습니다. 아니 그래프인가봅니다.
그럼 안녕!
'C,C++' 카테고리의 다른 글
[C/C++]동적할당(malloc/new) 실패 시 return value (0) | 2016.11.24 |
---|