2015-01-25 5 views

답변

6

지워진 요소 다음에 요소를 복사 한 다음 끝에 "빈"요소로 채 웁니다. 그리고 크기를 1보다 작게 표시합니다. 당신은 어떻게 REAL 구현을 보려면이

template<typename T>std::vector::erase(int index) 
{ 
    // Call destructor of T for the one being deleted. 
    storage[index].T~(); 
    for(i = index; i < size-1; i++) 
    { 
     storage[i] = storage[i+1]; 
    } 
    storage[size-1] = T(); 
    size--; 
} 

[실제 구현이 입주 의미를 사용하여 예를 들어, 불필요한 복사 등을 피하기 위해 트릭을 사용하는 것]처럼

는 대략 코드가 될 것이다 작품, 나는 당신이 디버거를 시작하고 자신을 밖으로 시도하는 것이 좋습니다. 그러나 끔찍하고 복잡하고 이해하기 힘들다면 놀랄 필요는 없습니다. 도서관 코드를 작성하는 사람들은 일반적으로 언어가 어떻게 작동하는지 잘 알고 있으며 "책의 모든 트릭"을 사용하여 더 빠르고 더 작게/더 깔끔하게 만듭니다.

+0

의미가있다. 코드에서 아주 기본적인 예제를 제공 하시겠습니까? 코드를 읽으면 개념을 완전히 이해하는 데 도움이됩니다. – FluffyKittens

+0

또한 '배열'이 '빈'요소로 채워져 있다고 말하면 정확히 무엇을 의미합니까? – FluffyKittens

+0

'std :: vector v가있는 경우; ... v.erase();'그러면 "shuffling"이후의 연산은 v [size-1] = T(); [또는 이와 동등한 것]이됩니다. –

2

끝에있는 요소 이외의 요소를 제거하면 제거 된 요소 다음의 요소가 왼쪽으로 이동합니다.

+0

모든 것이 포함되는 것은 루프 셔플 링이며 마지막 요소 (더 이상 필요하지 않음)를 파괴하고 기록 된 크기를 1 줄입니다. 요소 유형에 따라 다양한 최적화가 가능하지만 기본 개념입니다. – Rob

2

벡터가 생성자를 호출하지 않고 메모리를 할당해야합니다. 그런 다음 배치 새 및 배치 삭제 (일명 소멸자 수동 호출)을 사용할 수 있습니다.

새 배치에는 메모리 주소를 지정하고 해당 메모리 주소를 가리키는 this으로 생성자를 호출하는 작업이 포함됩니다. 배치 삭제에는 소멸자 실행 중이지만 메모리를 비우지 않아야합니다. (벡터는 메모리 블록에 고정 된 다음 다른 위치에 새로운 객체를 배치합니다).

벡터는 또한 작업을 수행 할 복사 할당 연산자, 복사 생성자, 이동 생성자, 이동 할당 연산자를 사용할 수 있습니다. C++ 11

이전 벡터 (분명 I 많은 기능을 생략 한) CopyAssignable 수 있으므로 기본 벡터 구현 요소를 필요 :

template<typename T> 
struct vector 
{ 
    T *base; 
    size_t m_count; 
    size_t m_capacity; 

    // start off with space reserved for 20 elements, but no actual elements 
    vector(): base((T *)new unsigned char[20 * sizeof(T)]), 
       m_count(0), m_capacity(20) {} 

    void push_back(T const &t) { 
     if (m_count == m_capacity) 
      reserve(m_capacity * 2); 

     // placement new, using copy-constructor 
     new(base + m_count) T(t); 
     ++m_count; 
    } 

    void erase(size_t index) 
    { 
    // Use the assignment-operator to shuffle all objects down by one 
    // (The "being erased" object doesn't get destructed directly, but it 
    // loses its state by having another object assigned to it. This is 
    // permitted because T must be CopyAssignable prior to C++11. In 
    // C++11 this function would try to Move objects down instead. 
     for (size_t i = index; i < m_count - 1; ++i) 
      base[i] = base[i+1]; 

    // Call destructor for the last object (which we currently have 2 of) 
     base[m_count-1].~T(); 
     --m_count; 

    } 
}; 
관련 문제