【发布时间】:2009-11-26 02:30:49
【问题描述】:
这是一个关于 BOOST_FOREACH 如何检查其循环终止的问题
cout << "Testing BOOST_FOREACH" << endl;
vector<int> numbers; numbers.reserve(8);
numbers.push_back(1); numbers.push_back(2); numbers.push_back(3);
cout << "capacity = " << numbers.capacity() << endl;
BOOST_FOREACH(int elem, numbers)
{
cout << elem << endl;
if (elem == 2) numbers.push_back(4);
}
cout << "capacity = " << numbers.capacity() << endl;
给出输出
Testing BOOST_FOREACH
capacity = 8
1
2
3
capacity = 8
但是在循环中途插入的数字 4 呢?如果我将类型更改为列表,则新插入的数字将被迭代。如果需要重新分配,向量 push_back 操作将使任何指针无效,但是在此示例中不会发生这种情况。所以我猜的问题是,为什么 end() 迭代器在使用向量时似乎只被评估一次(在循环之前),但在使用列表时具有更动态的评估?
【问题讨论】:
-
我得到一个运行你的代码的断言,Visual Studio 2008。
-
@Gman:要让它在 Visual Studio 2008 下工作,您必须禁用迭代器调试 (
/D_HAS_ITERATOR_DEBUGGING=0)。 -
这不是有点违背目的吗?您正在未定义的行为领域做某事。 修复警告,不要让它们静音。这就像有一个编译器会在您超出数组边界时向您发出警告,但您将其禁用以便您无论如何都可以这样做。
-
我并没有说这在实践中是一个好主意(这不是,我同意;这是一个糟糕的主意);我刚刚说过,为了让他的示例正常工作,需要禁用迭代器调试。
-
糟糕,我读了“Ja-”并假设你是 OP。愚蠢的我仍然不习惯寻找突出显示的提问者姓名。好的,我假设你知道警告。 :P