执行循环并在倒数第二个元素之后停止(在C++11中)最优雅的方式是什么?
注意:我指的是双向迭代器;随机访问迭代器当然是一个微不足道的特例,因为它们有+和-运算符。
std::list<double> x{1,2,3,4,5,6};
for (auto iter = x.begin(); iter != x.end(); ++iter) {
auto iter2 = iter;
++iter2;
if (iter2 == x.end()) break;
std::cout << *iter << std::endl;
}发布于 2012-06-18 02:42:19
使用std::prev函数:
std::list<double> x{1,2,3,4,5,6};
for (auto iter = x.begin(); iter != std::prev(x.end()); ++iter) {
std::cout << *iter << std::endl;
}发布于 2012-06-18 02:45:04
在C++03中,它应该是:
for (std::list<double>::iterator it = x.begin(), it_last = --x.end();
it != it_last; ++it)
{
std::cout << *it << '\n';
}在C++11中,没有什么本质上的不同,只是没有那么冗长:
for (auto it = begin(x), it_last = --end(x); it != it_last; ++it)
{
std::cout << *it << '\n';
}发布于 2012-06-18 02:47:47
对R. Martinho Fernandes的略微改进回答:
使用std::prev函数:
std::list<double> x{1,2,3,4,5,6};
for (auto iter = x.begin(), end=std::prev(x.end()); iter != end; ++iter) {
std::cout << *iter << std::endl;
}这只计算一次:std::prev(x.end())。
https://stackoverflow.com/questions/11073860
复制相似问题