Поддерживает ли итератор оператор +? - PullRequest
5 голосов
/ 04 ноября 2010

Я видел следующий код, используемый для удаления одного выбранного элемента из std::vector:

vector<hgCoord>::iterator it;
int iIndex = 0;
    const int iSelected = 5;
for( it = vecPoints.begin(); it != vecPoints.end(); ++it, ++iIndex )
{
    if( iIndex == iSelected )
    {
        vecPoints.erase( it );
        break;
    }
}

Я утверждаю, что этот код неэффективен и должен быть написан следующим образом:

vector<hgCoord>::iterator it;
int iIndex = 0;
    const int iSelected = 5; // we assume the vector has more than 5 elements.

    vecPoints.erase( vecPoints.begin() + iSelected );

Однако я не уверен, соответствует ли этот код стандарту C ++ STL.

Ответы [ 4 ]

12 голосов
/ 04 ноября 2010

Чтобы сделать этот код универсальным, чтобы он работал независимо от того, поддерживает ли итератор operator +, и использует наиболее эффективную доступную реализацию:

template <typename C>
void erase_at(C& container, typename C::size_type index) {
    typename C::iterator i = container.begin();
    std::advance(i, index);
    container.erase(i);
}

Внутренне, std::advance использует operator +, еслиТип итератора это поддерживает.В противном случае (например, для std::list<>::iterator) он перемещает итератор на один шаг за раз в цикле, точно так же, как и первый код, который вы опубликовали.

10 голосов
/ 04 ноября 2010

Итераторы с произвольным доступом поддерживают сложение и вычитание, а std::vector итераторы с произвольным доступом.

2 голосов
/ 04 ноября 2010

Вы правильно спорите:)

1 голос
/ 04 ноября 2010

Это должно хорошо работать для вектора, потому что векторные итераторы являются итераторами с произвольным доступом, поэтому можно добавить смещение, как вы сделали. То же самое не будет работать для некоторых других типов контейнеров (таких как deque или map).

Итак, ваш код лучше для вектора, но другой код, возможно, предназначен для работы с контейнерами других типов.

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