迭代器是否支持+运算符?

q09*_*987 5 c++ stl

我看到以下代码用于从以下位置删除一个选定的元素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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这段代码效率不高,应该写成如下:

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 );
Run Code Online (Sandbox Code Playgroud)

但是,我不确定此代码是否遵循C++ STL标准.

Kon*_*lph 12

要使此代码具有通用性,因此无论迭代器是否支持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);
}
Run Code Online (Sandbox Code Playgroud)

在内部,如果迭代器类型支持它,则std::advance使用operator +它.否则(例如for std::list<>::iterator)它会在循环中一次一步地推进迭代器,就像你发布的第一个代码一样.

  • 回应对dirbeas删除的答案的评论 - 我认为`std :: advance`修改其论点的原因与事实有关,因为它非常类型无关,特别是它适用于所有InputIterators,它们是*便宜*但*危险*复制.当与可能只是InputIterator而不是ForwardIterator的迭代器一起使用时,你不能再安全地使用旧值,所以即使它确实返回了迭代器,你仍然只能将它用作`i = std ::提前(i,n);`,或者在一个临时的,如在dribeas'代码中.返回`void`有助于防止愚蠢.有时.也许. (3认同)

Joh*_*eek 10

随机访问迭代器支持加法和减法,std::vector迭代器是随机访问.