본문 바로가기

2018-02/c++

자료구조 요점정리

주요 알고리즘

sort(arr, arr+5, greater<int>());

sort(v1.begin(),v1.end(),greater<int>());


---


1. 일반 배열


- 선언

int arr[4] = {1,2,3,4};

- 인덱싱

arr[2];

- 2차원 선언

arr[2][3];


2. 동적 배열


- 선언

int * arr = new int[3];

2차원 배열 선언

int ** arr = new int * [10];

for(int i = 0 ; i < 10 ; i++){

arr[i] = new int[15];

}


3. 벡터


- 선언

vector<int> arr1;

같은 값으로 미리 채운다

vector<int> arr1(10 , 123); // 갯수, 숫자


- 인덱싱

arr1[2]

arr1.at(2);


- 삽입

arr1.push_back(12);

arr1.insert(arr1.begin()+i, 12); // i번째 인덱스 "앞에" 끼워넣어서 새로운 벡터의 i번째가 된다.

arr1.insert(arr1.end(),arr2.begin(),arr2.end()); // arr1 맨 뒤에 arr2 전체를 끼워 넣는다.


- 삭제

arr1.erase(arr1.begin()+1) // 1번째 인덱스를 삭제

arr1.erase(arr1.begin()+2, arr1.begin()+5); // 2 ~ 4번째 인덱스를 삭제(마지막꺼는 삭제 x)

arr1.clear() // 전체 삭제


- 공간 확보

arr1.reserve(100);


- 참고 사항

 * 벡터 대소비교 및 등호 사용 가능하다!! 앞에서부터 lexiographically 비교한다.


4. 스택


- 선언

stack<int> arr1;


- 인덱싱

arr1.top();


- 삽입

arr1.push(12);


- 삭제

arr1.pop(); // void return이므로 top으로 쓰고 팝 할것


5. 큐


- 선언

queue<int> arr1;


- 인덱싱

arr1.front();

arr1.back();


- 삽입

arr1.push(12)


-삭제

arr1.pop();


6. 우선순위 큐(힙)


- 선언

priority_queue<int> arr1; // max heap

priority_queue<int, vector<int>, greater<int>> arr1; // min heap


- 인덱싱

arr1.top()


- 삽입

arr1.push(12)


- 삭제

arr1.pop()


7. 스트링


- 띄어쓰기 포함 입력받기

getline(cin, name);


- 선언

string s;


- 인덱싱

s.at(1);

s[1];


- 삽입

s.push_back(char)

s.append(string variable)

s.insert(s.begin()+2, 'b');


- 삭제

s.erase(5) // 5 부터 쭉 삭제

s.erase(s.begin()+5) // 5만 딱 삭제

s.erase(5,9) // 5부터 시작해서 딱 9개 삭제

s.erase(s.begin()+5,s.begin()+9) // 5부터 시작해서 8까지 삭제


- 부분스트링 찾기

s.find(t); >> 찾으면 해당 인덱스 반환 못 찾으면 -1 반환

O(N)


- 부분 들어내고 딴걸로 바꾸기

s.replace(9,5,t); >> 9 10 11 12 13 5개 들어내고 t로 채우기(더 길어도 됨)

O(N)


- 스트링을 정수형으로

int z = stoi("132323");


- 참고 사항

* 스트링은 별도 counting sort를 만들면 O(k)로 정렬 가능하다!!


8. 리스트


- 선언

list<int> arr;


- 삽입

s.insert(advance(s.begin(),3),3);


- 삭제

s.erase(it);


- 인덱싱

s.front()

*it


9. 맵

map

multimap

unordered_map

unordered_multimap


앞 두개는 BST, 뒤 두개는 Hash table


- 선언

map<int,int> arr

multimap<int,int> arr

unordered_map<int,int> arr

unordered_multimap<int,int> arr


- 삽입

arr.insert(key) // arr.insert(23)


- 인덱싱

arr.find(23) >> returns iterator

arr.equal_range(23) >> returns iterator start, end ( end iterator은 그 자신은 포함 안하고 하나 앞까지가 진짜다 )

발견 못하면 end(), end() 반환함


arr.lower_bound(2) >> 2를 포함해서 더 큰 첫 index 반환

arr.upper_bound(2) >> 2보다 더 큰 첫 index 반환(2를 포함 x)

-- 이것들은 set,map,multiset,multimap에만 있다. 대소비교가 가능해서. O(logN).


- 삭제

arr.erase(itlow,itup) // itlow ~ itup-1 까지 삭제

arr.erase(23) // 23 키를 가진 것 삭제 ( multi 에서는 그 키 전부 삭제 )


- 순회

1
2
3
4
5
6
7
8
9
10
11
#include <unordered_set>
 
using namespace std;
 
int main(){
    unordered_set<int> tmp;
    for(auto it = tmp.begin() ; it != tmp.end() ; it++){
        cout << *it << endl;
    }
}
 
cs


- 참고 사항

 * 만약 multiset 같은데서 각 키별로 뭘 할 일이 있으면 set을 하나 더 써서 같이 삽입하면 된다.

 * find는 multi에서는 첫 번째 입력했던 value를 반환한다. 하나만.

 * map에서 iterator은 pair이므로 it->first, it->second 사용

 * multimap, multiset 은 모두 key 만 정렬해주고 value는 정렬 안해준다!!!


10. 셋

set

multiset

unordered_multiset

unordered_set

사실상 맵과 같다.


11. 이터레이터


큐, 스택, priority_queue에는 없다. 아예 업음!!


vector<int>::iterator it = arr1.begin() // 이게 정식 변수명


advance(it, -3) // 앞으로 3개 전진한다.

begin(arr), end(arr) // 앞뒤 원소의 이터레이터를 내놓는다.


it = it + 3 // +- 연산자는 벡터, 스트링에 있는데 나머지에는 없다. ++, -- 만 존재.


front, back >> vector, list 에는 존재. queue, stack, map 류에는 안 존재.


- 참고 사항

 * 클래스 간 대소비교를 하는데, STL 클래스들은 이터레이터를 순회하면서 개별 대소비교를 하는 것 같다. 즉 operator > < == 사용 가능!


11. back, front


list, vector, queue에 존재

stack, priority_queue에는 아예 없음


** 참고 사항


- 벡터나 셋 등도 전부 클래스인데, 클래스를 인자로 넣으면 전부 call by value로 원본 값에 레퍼런스 하지 않는다. 원본 값을 변경하고 싶으면 * 나 &을 쓰자. 근데 &는 참조 변수로 그 변수 자체가 그 값을 가리키는 별명인데, 포인터 변수는 그야말로 주소값 변수이다.




** 기타 내용

- 함수 인자에 const를 붙이는 경우 밖에서 거기에 const 아닌걸 넣는건 괜찮은데, 함수 내에서 그 인자의 값을 바꿀 수 없다.



'2018-02 > c++' 카테고리의 다른 글

c++ 라이브러리와 함수 요약  (0) 2018.04.18
연산자와 비트 연산  (0) 2018.04.13
자료구조 요점정리  (0) 2018.04.02
STL Stack  (0) 2018.04.01
IO  (0) 2018.03.30
File I/O  (0) 2018.03.30