我看到以下代码用于从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标准。
答案 0 :(得分: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);
}
如果迭代器类型支持std::advance
,则operator +
在内部使用std::list<>::iterator
。否则(例如对于{{1}})它会在循环中一次一步地推进迭代器,就像你发布的第一个代码一样。
答案 1 :(得分:10)
随机访问迭代器支持加法和减法,std::vector
迭代器是随机访问。
答案 2 :(得分:2)
你正确地争辩说:)
答案 3 :(得分:1)
对于向量应该可以正常工作,因为向量迭代器是随机访问迭代器,所以可以像你一样添加偏移量。对于其他一些容器类型(例如deque或map),这同样不适用。
因此,您的代码更适合矢量,但其他代码可能适用于其他类型的容器。