繁体   English   中英

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

[英]Does iterator support + operator?

我看到以下代码用于从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 )它会在循环中一次一步地前进迭代器,就像你发布的第一个代码一样。

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

你正确争辩:)

这应该适用于矢量,因为矢量迭代器是随机访问迭代器,所以可以像你一样添加偏移量。 对于其他一些容器类型(例如deque或map),这同样不适用。

因此,对于向量,您的代码更好,但其他代码可能已用于其他类型的容器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM