ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자료구조...8
    일지 2020. 9. 30. 14:43

    ArrayList 데이터 삭제 메소드 구현

    데이터 삭제의 경우 공간을 축소하는 동작은 하지 않는다.

     

    즉, 기존에 공간(Capacity)이 5인 ArrayList에 삽입 동작을 통해 공간이 10으로 증가했을 때, 다시 데이터를 삭제한다고 해서 공간을 5로 줄이는 동작은 하지 않는다.

     

    ArrayList.cpp

    /// <summary>
    /// ArrayList에서 가장 먼저 발견되는 값을 제거한다.
    /// </summary>
    /// <param name="value">제거할 값</param>
    void ArrayList::Remove(int value)
    {
    	// 저장된 값에서 지정된 값의 인덱스를 찾아 제거한다.
    	for (int i = 0; i < m_count; i++)
    	{
    		if (m_items[i] == value)
    		{
    			MoveToLeft(i);
    			return;
    		}
    	}
    }
    
    /// <summary>
    /// ArrayList에서 지정된 인덱스의 값을 제거한다.
    /// </summary>
    /// <param name="index">제거할 인덱스(조건: 0이상)</param>
    void ArrayList::RemoveAt(int index)
    {
    	if (index < 0 || index >= m_count)
    	{
    		throw std::out_of_range("index");
    	}
    
    	MoveToLeft(index);
    }
    
    /// <summary>
    /// ArrayList에서 지정된 범위의 값을 제거한다.
    /// </summary>
    /// <param name="index">제거할 범위의 시작 인덱스</param>
    /// <param name="count">제거할 값 개수</param>
    void ArrayList::RemoveRange(int index, int count)
    {
    	if (index < 0)
    	{
    		throw std::out_of_range("index");
    	}
    	else if (count < 0)
    	{
    		throw std::out_of_range("count");
    	}
    
    	if (index >= m_count)
    	{
    		throw std::invalid_argument("index");
    	}
    	else if (count > m_count - index)
    	{
    		throw std::invalid_argument("count");
    	}
    
    	MoveToLeft(index, count);
    }
    
    /// <summary>
    /// ArrayList의 모든 값을 제거한다.
    /// </summary>
    void ArrayList::Clear()
    {
    	m_count = 0;
    }
    
    /// <summary>
    /// 제거 이후 빈 공간 제거를 위해 값을 왼쪽으로 이동시킨다.
    /// </summary>
    /// <param name="index">데이터를 삭제할 인덱스</param>
    /// <param name="removeCount">삭제할 값의 개수(기본: 1)</param>
    void ArrayList::MoveToLeft(int index, int removeCount)
    {
    	for (int i = index; i < m_count - removeCount; i++)
    	{
    		m_items[i] = m_items[i + removeCount];
    	}
    	m_count -= removeCount;
    }

     

    ※ 삭제 동작은 속도 향상을 위해 값을 이동시킨 후 기존 위치의 값을 따로 초기화하지 않는다.

    댓글

Designed by Tistory.