迭代向量的元素时,最好使用迭代器而不是索引(请参阅为什么使用迭代器而不是数组索引?).
std::vectorvec; std::vector ::iterator it; for ( it = vec.begin(); it != vec.end(); ++it ) { // do work }
但是,可能需要在循环体中使用索引.考虑到性能和灵活性/可扩展性,在这种情况下,下列哪一项更可取?
恢复到索引循环
std::vector vec; size_t i; for ( i = 0; i < vec.size(); ++i ) { // use i }
计算偏移量
std::vector vec; std::vector::iterator it; for ( it = vec.begin(); it != vec.end(); ++it ) { size_t i = it - vec.begin(); // use i }
使用std :: distance
std::vector vec; std::vector::iterator it; for ( it = vec.begin(); it != vec.end(); ++it ) { size_t i = std::distance( vec.begin(), it ); // use i }
Luc Touraill.. 13
如果您计划仅使用向量,则可能需要切换回索引循环,因为它比迭代器循环更清楚地传达您的意图.但是,如果将来程序的演变可能导致容器的更改,则应该坚持使用迭代器并使用std :: distance,这可以保证与所有标准迭代器一起使用.
如果您计划仅使用向量,则可能需要切换回索引循环,因为它比迭代器循环更清楚地传达您的意图.但是,如果将来程序的演变可能导致容器的更改,则应该坚持使用迭代器并使用std :: distance,这可以保证与所有标准迭代器一起使用.
使用std :: distance更通用,因为它适用于所有迭代器,而不仅仅是随机访问迭代器.在随机访问迭代器的情况下,它应该与它一样快 - vec.begin().
它 - vec.begin()基本上是指针算术.
std::distance(vec.begin(), it)
会给你索引it
指向,假设它指向vec
.
卡尔