这是一个问题,去BOOST_FOREACH怎么检查它的循环终止修改向量的内容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()迭代器在使用vector时似乎只被评估过一次(在循环之前),但在使用列表时有更多的动态评估?
我得到了一个运行代码的断言,Visual Studio 2008。 – GManNickG 2009-11-26 02:43:07
@Gman:为了使它在Visual Studio 2008下工作,必须禁用迭代器调试('/ D_HAS_ITERATOR_DEBUGGING = 0')。 – 2009-11-26 02:46:09
这不就是击败目的吗?你正在做一些未定义的行为之地。 **修正警告,不要让它们沉默。**这就好像有一个编译器在你超出数组界限时警告你,但是你禁用了它,所以你可以这样做。 – GManNickG 2009-11-26 02:50:09