C++
我有以下迭代循环:
for (it = container.begin(); it != container.end(); ++it) {
//my code here
}
我想尽早结束这个迭代 1 元素。我尝试了以下方法,但无法编译:
for (it = container.begin(); it != container.end() - 1; ++it) { //subtract 1
//my code here
}
如何才能做到这一点?谢谢。
std::prev(s.end())
你可以在你的集合之前迭代到一个s
,注意容器为空的可能性:
#include <iterator> // for std::prev
auto first = s.begin();
auto last = s.empty() ? s.end() : std::prev(s.end()); // in case s is empty
for (auto it = first; it != last; ++it) { ... }
注意:std::prev
需要 C++11 支持。C++03 的替代方案是--s.end()
.
尝试std::prev
:
for (it = container.begin(); it != std::prev(container.end()); ++it) { //subtract 1
//my code here
}
for (it = container.begin(); it != --result->container.end(); ++it) { //subtract 1
//my code here
}
std::set::iterator
--
是双向的,这意味着您可以++
在上面做。但是,它不满足随机访问迭代器的要求,因此您不能-
使用+
它。
result->container.end() - 1
需要一个随机访问迭代器,但你只有一个双向迭代器。相反,您可能想要--result->container.end()
.
此外,您可能不想每次都重新计算,尽管这没什么大不了的:
for (auto i(begin(result->container)), e(--end(result->container)); i!=e; ++i) {
找到最后一个迭代器的 c++98 解决方案可以是
set.find(*set.rbegin())
另一种选择,虽然它是无证的,也不被人们推荐
it!= --set.end()
也有效,当 set 为空时它的行为应该是未定义的(开始 == 结束)