Как написать собственный метод Vector для удаления элемента без использования vector :: erase ()? - PullRequest
0 голосов
/ 01 октября 2019

Я пишу собственный векторный класс, и мне нужно иметь функцию стирания без фактического использования vector :: erase ();

Мне нужна та же функциональность, используя только то, что я могу написать вместе снесколько других предварительно выполненных методов, таких как resize (), reserve (), pop и push_back. Единственный параметр, который требуется, это итератор. Мой вектор специально содержит несколько списков. Элемент, на который указывает итератор, должен быть удален, а остальная часть вектора осталась прежней.

Вот некоторые из методов, которые у меня уже есть:


void resize( int newSize )
    {
        if( newSize > theCapacity )
            reserve( newSize * 2 );
        theSize = newSize;
    }

    void reserve( int newCapacity )
    {
        if( newCapacity < theSize )
            return;

        Object *newArray = new Object[ newCapacity ];
        for( int k = 0; k < theSize; ++k )
            newArray[ k ] = std::move( objects[ k ] );

        theCapacity = newCapacity;
        std::swap( objects, newArray );
        delete [ ] newArray;
    }

      // Stacky stuff
    void push_back( const Object & x )
    {
        if( theSize == theCapacity )
            reserve( 2 * theCapacity + 1 );
        objects[ theSize++ ] = x;
    }
      // Stacky stuff
    void push_back( Object && x )
    {
        if( theSize == theCapacity )
            reserve( 2 * theCapacity + 1 );
        objects[ theSize++ ] = std::move( x );
    }

    void pop_back( )
    {
        if( empty( ) )
            throw UnderflowException{ };
        --theSize;
    }

Это такая вещьвозможно?

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Простая реализация с итераторами:

void erase(Iterator<Object> it) {
    while (next(it) != end()) {
        *it = *next(it); // or std::move(*next(it))
        it  =  next(it);
    }
    --theSize;
    end()->Object::~Object(); // not necessary -- assumes updated end()
}
0 голосов
/ 01 октября 2019

Обычно std :: vector :: erase вручную вызывает dtor, использует размещение new для копирования конструкции (или перемещения конструкции, если она доступна) элементов в этот промежуток, а затем изменяет конечный итератор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...