我看到了以下代码,用于从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
),循环一次将迭代器前进一个步骤,就像您发布的第一个代码一样。