티스토리 뷰

190702-1 - 메모리활용
 
교육을 받으면서 노트필기 했던 내용을 날것 그대로 업로드합니다.

 
● new 로 동적 배열 할당 해보기
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
int main() {
    int row = 3;
    int col = 4; // input
 
    int** p = new int* [row];
 
    //int** p = (int**)malloc(sizeof(int*) * row);
    for (int i = 0; i < row; ++i) {
        p[i] = new int[col];
    }
 
    for (int i = 0; i < row; ++i)
        for (int j = 0; j < col; ++j)
            p[i][j] = (i * 3 + j + 1) * 10;
 
    printf("%d %d %d\n", p[0][0], p[0][1], p[0][2]);
    printf("%d %d %d\n", p[1][0], p[1][1], p[1][2]);
 
    for (int i = 0; i < row; ++i) {
        delete[] p[i];
    }
    delete[] p;
}

new,delete
new[],delete : 내부적으로 할당 크기까지 저장한다.
 
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
int main() {
    int row = 3;
    int col = 4;
    vector<vector<int>> v(row);
 
    for (int i = 0; i < row; ++i) {
        v[i].resize(col);
    }
 
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            v[i][j] = (i * col + j + 1) * 10;
        }
    }
 
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            printf("%d ", v[i][j]);
        }
        printf("\n");
    }
}
 
 
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
int main() {
    int row = 3;
    int col = 4;
    vector<vector<int>*> v(row); // 벡터의 주소를 원소로 갖는다.
 
    for (int i = 0; i < row; ++i) {
        v[i] = new vector<int>(col);
    }
 
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            (*v[i])[j] = (i * col + j + 1) * 10;
        }
    }
 
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            printf("%d ", (*v[i])[j]);
        }
        printf("\n");
    }
 
    for (int i = 0; i < row; i++)
    {
        delete v[i];
    }
}
● 연산자 중복 활용
 
● 참조자를 활용
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
int main() {
    int row = 3;
    int col = 4;
    vector<vector<int>*> v(row); // 벡터의 주소를 원소로 갖는다.
    
    for (int i = 0; i < row; ++i) {
        v[i] = new vector<int>(col);
    }
 
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            vector<int>& arr = (*v[i]);
            arr[j] = (i * col + j + 1) * 10;
        }
    }
 
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            vector<int>& arr = (*v[i]);
            printf("%d ", arr[j]);
        }
        printf("\n");
    }
 
    for (int i = 0; i < row; i++)
    {
        delete v[i];
    }
}
● 원할 때 마다 new로 할당할 수 있다는 장점이 있다.
 
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
class Image {
    //vector<vector<int>*> v/*(row)*/; // 초기화 불가 -> 생성자에서만 가능
    vector<vector<int>*>* pv; // 그래서 보통 포인터를 주어 초기화 하는 형태로 사용
};
int main() {
    int row = 3;
    int col = 4;
 
    // 객체를 실시간으로 만들어 낼 수 있는 효율적인 코드를 작성할 수 있다.
    vector<vector<int>*>* pv;
    pv = new vector < vector<int>*>(row);
 
    for (int i = 0; i < row; ++i) {
        (*pv)[i] = new vector<int>(col);
    }
 
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            vector<int>& arr = *(*pv)[i];
            arr[j] = (i * col + j + 1) * 10;
        }
    }
 
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            vector<int>& arr = *(*pv)[i];
            printf("%d ", arr[j]);
        }
        printf("\n");
    }
 
    for (int i = 0; i < row; i++)
    {
        delete (*pv)[i];
    }
    delete pv;
}
 
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
class Image {
    //vector<vector<int>*> v/*(row)*/; // 초기화 불가 -> 생성자에서만 가능
    vector<vector<int>*>* pv; // 그래서 보통 포인터를 주어 초기화 하는 형태로 사용
    //생성전까지는 할당하고 싶지 않을 때. 불필요한 메모리 낭비를 없앤다.
    
};
int main() {
    int row = 3;
    int col = 4;
 
    // 객체를 실시간으로 만들어 낼 수 있는 효율적인 코드를 작성할 수 있다.
    vector<vector<int>>* pv;
    pv = new vector <vector<int>>(row);
 
    for (int i = 0; i < row; ++i) {
        (*pv)[i].resize(col);
    }
 
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            
            (*pv)[i][j] = (i * col + j + 1) * 10;
        }
    }
 
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            printf("%d ", (*pv)[i][j]);
        }
        printf("\n");
    }
 
    delete pv;
}
 
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
class Image {
    //vector<vector<int>*> v/*(row)*/; // 초기화 불가 -> 생성자에서만 가능
    vector<vector<int>*>* pv; // 그래서 보통 포인터를 주어 초기화 하는 형태로 사용
    //생성전까지는 할당하고 싶지 않을 때. 불필요한 메모리 낭비를 없앤다.
 
};
int main() {
    int row = 3;
    int col = 4;
 
    // 객체를 실시간으로 만들어 낼 수 있는 효율적인 코드를 작성할 수 있다.
    vector<vector<int>>* pv;
    pv = new vector <vector<int>>(row);
 
    for (int i = 0; i < row; ++i) {
        vector<vector<int>>& v = (*pv); // 객체의 참조를 사용.
        // 이런 형태를 많이 사용한다.
        v[i].resize(col);
    }
 
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            vector<vector<int>>& v = (*pv);
            v[i][j] = (i * col + j + 1) * 10;
        }
    }
 
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            vector<vector<int>>& v = (*pv);
            printf("%d ", v[i][j]);
        }
        printf("\n");
    }
 
    delete pv;
}
 
댓글
댓글쓰기 폼
네이버 이웃추가
«   2019/10   »
    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    
글 보관함