我看到了以下代码,用于从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标准。

最佳答案

为了使此代码通用,无论迭代器是否支持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),循环一次将迭代器前进一个步骤,就像您发布的第一个代码一样。

08-28 12:07