如何遍历列表但停在size-1

Tum*_*uma 2 c++ iterator for-loop c++11

这段代码:

for (std::list<point>::const_iterator it = controlPoints->begin();
    it != controlPoints->end();
    ++it) {
    ...
    }
Run Code Online (Sandbox Code Playgroud)

对应于:

for (int i = 0; i < controlPoints->size; i++) {
...
}
Run Code Online (Sandbox Code Playgroud)

意思是,如果我每次循环获得一个元素,它将迭代列表中的所有元素.

什么对应于:

for (int i = 0; i < controlPoints->size-1; i++) {
    ...
    }
Run Code Online (Sandbox Code Playgroud)

我的意思是,如何使用迭代器循环大小1次?

Jer*_*fin 9

显而易见的方法是将迭代器放到最后并减少它:

auto stop = controlPoints.end();
--stop;

for (std::list<point>::const_iterator it = controlPoints->begin();
    it != stop;
    ++it) {
    ...
    }
Run Code Online (Sandbox Code Playgroud)

您可以使用std::advance或者std::next如果您愿意,但对于这种情况,简单的减量就可以了.

  • 只是明确说明非常明显的警告:确保你的`list <>`事先不是空的,因为`it!= stop`条件对那种情况不起作用(它是未定义的行为). (3认同)

Xer*_*rcy 6

controlPoints->end() 也是一个迭代器.

你可以这样做:

std::list<point>::const_iterator it = controlPoints->begin();
std::list<point>::const_iterator stop = controlPoints->end();
if ( it != stop) for ( --stop; it != stop; ++it) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

更详细,但使用该列表是否包含0个,1个或更多元素是安全的.

这里的关键是迭代器可以递增,并且(对于双向迭代器)递减以提前/后退位置,因此它相当于:

int it = 0;
int stop = list.size();
if (it != stop) for( --stop; it < stop; ++it ) {
    ...
}
Run Code Online (Sandbox Code Playgroud)