ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • c++ 배열 사용 팁
    백준코딩일기 2020. 10. 17. 09:20

    1. 전체를 특정 값으로 초기화 시킬 때, 효율적으로 할 수 있는 방법

    1). cstring 헤더에 있는 memset함수를 활용하는 방법
        -> 실수할 여지가 굉장히 많음. 0이나 -1 이 아닌 다른 값을 넣으면 오동작하거나,
            2차원 이상의 배열을 함수의 인자로 넘겨 그 곳에서 memset을 하면 잘 못 들어가기도 함.

    int a[10];
    memset(a, 0, sizeof a);

     

    2). for문을 돌면서 하나하나 값을 바꾸는 방식
       -> 실수할 여지가 없어서 무난하고 좋음

    int b[10];
    for(int i=0; i<10; i++) {
    	b[i] = 0;
    }

     

    3). algorithm 헤더의 fill 함수 이용 -> 실수의 여지가 적음. 코드가 짧아서 익숙해진다면 가장 추천하는 방식

    int c[10];
    fill(c, c+10, 0);
    int c[10];
    for(int i=0; i<10; i++){
    	fill(c[i], c[i]+10, 0)
    }

     

     

     

    2. STL vector

    vector 는 배열과 거의 동일한 기능을 수행하는 자료구조
    배열과 마찬가지로 원소가 메모리에 연속하게 저장되어서 O(1)의 인덱스를 가지고 각 원소로 접근 가능.

    배열과 다르게 크기를 자유자재로 늘리거나 줄일 수 있다는 장점이 있음.
    추후에 그래프의 인접 리스트라는 것을 저장할 때에는 vector를 사용하는 것이 편해서 필요하지만, 그 전에는 배열대신 쓸 필요는 없음.

     

    레퍼런스 사이트 :: www.cplusplus.com/reference/vector/vector/  

     

     

    vector - C++ Reference

    difference_typea signed integral type, identical to: iterator_traits ::difference_type usually the same as ptrdiff_t

    www.cplusplus.com

     

    ** vector 멤버함수 **

     

    • v.front();   // 첫번째 원소를 참조
    • v.back();   // 마지막 원소를 참조
    • v.at(idx);   // idx번째 원소를 참조
                         v[idx] 보다 속도는 느리지만, 범위를 점검하므로 안전함

    • v[idx];      // idx 번째 원소를 참조
                        범위를 점검하지 않으므로 속도가 v.at(idx)보다 빠릅니다.
    • v.assign(5, 2);
      - 2의 값으로 5개의 원소 할당.

    • v.clear();
      - 모든 원소를 제거합니다.
      - 원소만 제거하고 메모리는 남아있습니다.
      - size만 줄어들고 capacity는 그대로 남아있습니다.

    • v.push_back(7);
      - 마지막 원소 뒤에 원소 7을 삽입합니다.

    • v.pop_back();
      - 마지막 원소를 제거합니다.

    • v.begin();
      - 첫번째 원소를 가리킵니다. (iterator와 사용)

    • v.end();
      - 마지막의 "다음"을 가리킵니다 (iterator와 사용)
    • v.rbegin();
      - reverse begin을 가리킨다 (거꾸로 해서 첫번째 원소를 가리킵니다)
      - iterator와 사용.

    • v.rend();
      - reverse end 을 가리킨다 (거꾸로 해서 마지막의 다음을 가리킵니다)
      - iterator와 사용.

    • v.reserve(n);
      - n개의 원소를 저장할 위치를 예약합니다(미리 동적할당 해놉니다)

    • v.resize(n);
      - 크기를 n으로 변경한다.
      - 더 커졌을 경우 default값인 0으로 초기화 한다.
    • v.resize(n,3);
      - 크기를 n으로 변경한다.
      - 더 커졌을 경우 인자의 값을 3으로 초기화한다.



    • v.size();
      - 원소의 갯수를 리턴한다.

    • v.capacity();
      - 할당된 공간의 크기를 리턴한다.
      - 공간 할당의 기준은 점점 커지면서로 capacity를 할당하게 됩니다.
      **size와 capacity에 관계는 4번 항목에서 설명드립니다. 중요하니 꼭 보고 가세요
    • v2.swap(v1);
      - v1과 v2의 원소와 capacity 바꿔줍니다. (모든걸 스왑해줌)
      - v1의 capacity를 없앨때 (할당한 메모리를 프로그램이 끝나기 전에 없애고 싶을때) 사용하기도 합니다.
      - v2를 capacity가 0인 임시 객체로 만들어서 스왑을 해줍니다.
      - vector<int>().swap(v1);

    • v.insert(2, 3, 4);
      - 2번째 위치에 3개의 4값을 삽입합니다. (뒤엣놈들은 뒤로 밀림)

    • v.insert(2, 3);
      - 2번째 위치에 3의 값을 삽입합니다.
      - 삽입한 곳의 iterator를 반환합니다.

    • v.erase(iter);
      - iter 가 가리키는 원소를 제거합니다.
      - size만 줄어들고 capacity(할당된 메모리)는 그대로 남습니다.
      - erase는 파라미터 하나를 받을때와 두개를 받을 때 다릅니다.
      - 그에 따른 예제는 여기있습니다.
    • v.empty()
      - vector가 비었으면 리턴 true
      - 비어있다의 기준은 size가 0이라는 것이지, capacity와는 상관이없습니다.

     

     

    #include <bits/stdc++.h>
    using namespace std;
    
    int main(void) {
      vector<int> v1(3, 5); // {5,5,5};
      cout << v1.size() << '\n'; // 3
      v1.push_back(7); // {5,5,5,7};
    
      vector<int> v2(2); // {0,0};
      v2.insert(v2.begin()+1, 3); // {0,3,0};
    
      vector<int> v3 = {1,2,3,4}; // {1,2,3,4}
      v3.erase(v3.begin()+2); // {1,2,4};
    
      vector<int> v4; // {}
      v4 = v3; // {1,2,4}
      cout << v4[0] << v4[1] << v4[2] << '\n';
      v4.pop_back(); // {1,2}
      v4.clear(); // {}
    }

     

     

     

    '백준코딩일기' 카테고리의 다른 글

    10845) 큐 c++  (0) 2020.11.04
    10804) 카드 역배치 c++  (0) 2020.10.17
    1919) 애너그램 만들기 c++  (0) 2020.10.17
    13300) 방 배정 c++  (0) 2020.10.17
    11328) Strfry c++  (0) 2020.10.17

    댓글

Designed by Tistory.