vector 유형의 객체가 내부적으로 배열에 의해지지되므로 벡터 클래스의 지우기 기능이 선택한 요소를 내부 배열에서 제거하는 방법은 무엇입니까?vector :: erase가 내부 배열에서 선택한 요소를 제거하는 방법
적어도 기본적인 코드 예제로 깊이있는 설명을 찾고 있습니다.
vector 유형의 객체가 내부적으로 배열에 의해지지되므로 벡터 클래스의 지우기 기능이 선택한 요소를 내부 배열에서 제거하는 방법은 무엇입니까?vector :: erase가 내부 배열에서 선택한 요소를 제거하는 방법
적어도 기본적인 코드 예제로 깊이있는 설명을 찾고 있습니다.
지워진 요소 다음에 요소를 복사 한 다음 끝에 "빈"요소로 채 웁니다. 그리고 크기를 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--;
}
[실제 구현이 입주 의미를 사용하여 예를 들어, 불필요한 복사 등을 피하기 위해 트릭을 사용하는 것]처럼
는 대략 코드가 될 것이다 작품, 나는 당신이 디버거를 시작하고 자신을 밖으로 시도하는 것이 좋습니다. 그러나 끔찍하고 복잡하고 이해하기 힘들다면 놀랄 필요는 없습니다. 도서관 코드를 작성하는 사람들은 일반적으로 언어가 어떻게 작동하는지 잘 알고 있으며 "책의 모든 트릭"을 사용하여 더 빠르고 더 작게/더 깔끔하게 만듭니다.끝에있는 요소 이외의 요소를 제거하면 제거 된 요소 다음의 요소가 왼쪽으로 이동합니다.
모든 것이 포함되는 것은 루프 셔플 링이며 마지막 요소 (더 이상 필요하지 않음)를 파괴하고 기록 된 크기를 1 줄입니다. 요소 유형에 따라 다양한 최적화가 가능하지만 기본 개념입니다. – Rob
벡터가 생성자를 호출하지 않고 메모리를 할당해야합니다. 그런 다음 배치 새 및 배치 삭제 (일명 소멸자 수동 호출)을 사용할 수 있습니다.
새 배치에는 메모리 주소를 지정하고 해당 메모리 주소를 가리키는 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;
}
};
의미가있다. 코드에서 아주 기본적인 예제를 제공 하시겠습니까? 코드를 읽으면 개념을 완전히 이해하는 데 도움이됩니다. – FluffyKittens
또한 '배열'이 '빈'요소로 채워져 있다고 말하면 정확히 무엇을 의미합니까? – FluffyKittens
'std :: vector v가있는 경우; ... v.erase();'그러면 "shuffling"이후의 연산은 v [size-1] = T(); [또는 이와 동등한 것]이됩니다. –