簡體   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