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
}
如何做到这一点?感谢。
答案 0 :(得分:8)
您可以在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
注意:--s.end()
需要C ++ 11支持。 C ++ 03的替代方案是{{1}}。
答案 1 :(得分:2)
尝试std::prev
:
for (it = container.begin(); it != std::prev(container.end()); ++it) { //subtract 1
//my code here
}
答案 2 :(得分:0)
for (it = container.begin(); it != --result->container.end(); ++it) { //subtract 1
//my code here
}
std::set::iterator
是双向的,这意味着您可以对其--
和++
进行操作。但是,它不符合随机访问迭代器的要求,因此您无法使用它-
和+
。
答案 3 :(得分:0)
result->container.end() - 1
需要一个随机访问迭代器,但您只有一个双向迭代器。相反,您可能需要--result->container.end()
。
你也可能不想每次都重新计算,尽管这不是什么大问题:
for (auto i(begin(result->container)), e(--end(result->container)); i!=e; ++i) {
答案 4 :(得分:0)
找到最后一个迭代器的c ++ 98解决方案可以是
set.find(*set.rbegin())
另一种选择虽然没有记录,但不是人们推荐的
it!= --set.end()
同样有效,当set为空(begin == end)
时,其行为应该是未定义的