7

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
}

如何才能做到这一点?谢谢。

4

5 回答 5

13

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().

于 2013-03-22T19:17:30.267 回答
2

尝试std::prev

for (it = container.begin(); it != std::prev(container.end()); ++it) { //subtract 1
    //my code here
}
于 2013-03-22T19:16:44.563 回答
0
for (it = container.begin(); it != --result->container.end(); ++it) { //subtract 1
    //my code here
}

std::set::iterator--是双向的,这意味着您可以++在上面做。但是,它不满足随机访问迭代器的要求,因此您不能-使用+它。

于 2013-03-22T19:17:02.953 回答
0

result->container.end() - 1需要一个随机访问迭代器,但你只有一个双向迭代器。相反,您可能想要--result->container.end().

此外,您可能不想每次都重新计算,尽管这没什么大不了的:

for (auto i(begin(result->container)), e(--end(result->container)); i!=e; ++i) {
于 2013-03-22T19:18:44.757 回答
0

找到最后一个迭代器的 c++98 解决方案可以是

set.find(*set.rbegin())

另一种选择,虽然它是无证的,也不被人们推荐

it!= --set.end()

也有效,当 set 为空时它的行为应该是未定义的(开始 == 结束)

于 2017-08-21T08:42:24.660 回答