• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

IntArray 구현 공유합니다

24.01.10 04:02 작성 24.01.10 04:03 수정 조회수 156

1

copy constructor, = operator overloading, << overloading 도 같이 해봤습니다

insertBefore, remove 에서 resize 를 쓰면 코드 반복을 줄일수 있는데, 비슷하게 옮기는걸 두번해서 속도 느려지기 때문에 그냥 각 함수에 기능들을 따로따로 만들었습니다...

class IntArray{
private:
    int _len;
    int *_arr = nullptr;
public:
    IntArray(int length) : _len(length) {
        _arr = new int[length];
    }
    
    // initializer_list constructor
    IntArray(const std::initializer_list<int> & ilist)
        : IntArray(ilist.size())
    {
        int i = 0;
        for (const auto & n : ilist) {
            _arr[i++] = n;
        }
    }
    
    // copy constructor
    IntArray(const IntArray &source)
        : IntArray(source._len)
    {
        for(int i = 0; i < _len; i++){
            _arr[i] = source._arr[i];
        }
    }

    // assignment operator overloading
    IntArray& operator = (const IntArray & source) {
        // prevent self-assignment
        if (&source == this) return *this;

        _len = source._len;
        delete[] _arr;
        if (source._arr == nullptr) {
            _arr = nullptr;
        }
        else {
            _arr = new int[_len];
            for(int i = 0; i < _len; i++){
                _arr[i] = source._arr[i];
            }
        }

        return *this;
    }

    // cout << overloading
    friend std::ostream& operator << (std::ostream &out, const IntArray &intarray) {
        out << "[ ";
        for(int i = 0; i < intarray._len; i++){
            out << intarray._arr[i] << " ";
        }
        out << "]";
        return out;
    }

    void reset(){
        _len = 0;
        delete[] _arr;
        _arr = nullptr;
    }

    void resize(int newlen) {
        int *newarr = new int[newlen];
        int minlen = std::min(_len, newlen);
        for(int i = 0; i < minlen; i++){
            newarr[i] = _arr[i];
        }
        delete[] _arr;
        _arr = newarr;
    }

    void insertBefore(const int &val, const int &ix) {
        _len++;
        int *newarr = new int[_len];
        for(int i = 0; i < ix; i++){
            newarr[i] = _arr[i];
        }
        newarr[ix] = val;
        for(int i = ix+1; i < _len; i++){
            newarr[i] = _arr[i-1];
        }
        delete[] _arr;
        _arr = newarr;
    }

    void remove(const int &ix) {
        _len--;
        int *newarr = new int[_len];
        for(int i = 0; i < ix; i++){
            newarr[i] = _arr[i];
        }
        for(int i = ix; i < _len; i++){
            newarr[i] = _arr[i+1];
        }
        delete[] _arr;
        _arr = newarr;
    }

    void push_back(const int &val){
        resize(++_len);
        _arr[_len-1] = val;
    }

    ~IntArray() {
        delete[] _arr;
    }
};

답변 1

답변을 작성해보세요.

1

Soobak님의 프로필

Soobak

2024.01.11

안녕하세요, 답변 도우미 Soobak 입니다.

 

좋은 공부 자료 공유 감사드립니다.
열정적으로 학습하시는 모습 뿐만 아니라, 이를 다른 수강생분들께도 공유하시는 모습이 참 인상 깊네요.

이미 잘 작성하신 코드이지만, 열심히 학습하시는 모습이 멋있으셔서 저 또한 같이 코드에 대해 고민하며 생각한 부분들을 공유 드립니다.

  • 예외 처리
    해당 함수들에서 새 배열을 할당하기 전에 현재 배열의 크기와 새로운 크기가 같은 경우, 그리고 비교하면 불필요한 할당을 피할 수 있을 것 같습니다. (빠른 리턴)
    예시)

     

    void resize(int newlen)
    {
      if (newLen == _len) return ; // 이미 원하는 크기와 같으면 아무 작업도 필요하지 않습니다.
    
      int *newarr = new int[newlen];
      int minlen = std::min(_len, newlen);
      for(int i = 0; i < minlen; i++){
        newarr[i] = _arr[i];
      }
      delete[] _arr;
      _arr = newarr;
    }

    또한, 컴파일러 마다 표준 라이브러리에 구현되어 있는 Array 객체에는 메모리 관리와 관련하여 학습하실 수 있는 내용들이 많으니 참고해보시면 도움이 많이 되실 것 같습니다.
    예를 들어, push_back() 함수를 매 번 호출할 때마다 resize() 를 하는 것은 반복되는 메모리 할당과 해제로 비효율적일 수 있으니, 미리 일정 크기의 메모리 공간을 할당하면서 특정 기준을 넘길 때에만 새롭게 메모리를 할당하는 방식으로 구현된 경우도 있습니다.

열심히 학습하시는 모습이 참 멋있으십니다. 👍👍👍

 

Hansh님의 프로필

Hansh

질문자

2024.01.12

피드백 감사합니다. 마지막에 쓰신 방법도 공부해봐야겠네요!