如何通过C ++ std :: set一个元素提前结束迭代?

时间:2013-03-22 19:14:26

标签: c++ loops iterator set

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
}

如何做到这一点?感谢。

5 个答案:

答案 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)

时,其行为应该是未定义的