- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是一个关于 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 呢?如果我将类型更改为列表,新插入的数字将被迭代。如果需要重新分配, vector push_back 操作将使任何指针无效,但是在本示例中不会发生这种情况。所以我想的问题是,为什么 end() 迭代器在使用 vector 时似乎只被评估一次(在循环之前),但在使用列表时具有更动态的评估?
最佳答案
Under the covers, BOOST_FOREACH uses iterators to traverse the element sequence. Before the loop is executed, the end iterator is cached in a local variable. This is called hoisting, and it is an important optimization. It assumes, however, that the end iterator of the sequence is stable. It usually is, but if we modify the sequence by adding or removing elements while we are iterating over it, we may end up hoisting ourselves on our own petard.
http://www.boost.org/doc/libs/1_40_0/doc/html/foreach/pitfalls.html
如果您不希望 end() 迭代器更改,请对 vector 使用 resize 而不是保留。
http://www.cplusplus.com/reference/stl/vector/resize/
请注意,您不想 push_back 而是使用 operator[]。但要小心不要越界。
关于c++ - 修改 BOOST_FOREACH 中 vector 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1801251/
我有一个包含一些数据的类,我想添加 begin()和 end()提供数据 ID 迭代器的函数。 我正在使用 Boost counting_iterator : #include #include
我正在编写 C++98(抱歉),但使用的是 C 库,它有许多对象存储在以下形式的数据结构中: struct c_container { size_t len; int data[1];
我尝试使用 Boost 库,我复制了整个 boost 文件夹,除了 docs、libs、more、status、tools 文件夹。 当我尝试使用下面的代码块时,我的编译器无法识别两件事。 vecto
我想使用 BOOST_FOREACH在我的代码库中使用我无法更改的遗留容器类型之一。 我在该类型上定义了以下方法: .length() 返回容器中元素的当前数量 .operator[](unsigne
我尝试在模板函数中使用 BOOST_FOREACH 和自定义但类型参数独立的迭代器。我收到 4-5 个错误,表明我的迭代器类没有很好地定义为迭代器。 在不使用 BOOST_FOREACH 的情况下重写
我想知道在调用之前获取对 vector 的引用是否有任何好处BOOST_FOREACH 或返回引用的方法调用是否会被自动使用?例如,以下两个循环中的哪一个将等同于第三个循环? vector& my_m
给定以下简单代码: list m_listOfOBjects; .... MyClass* ptrToMyClass; BOOST_FOREACH(MyClass object, m_listOfOb
我实现了一个简单的类 MyClass,其中有一个分配有 new 的数组(我知道我可以使用 STL 容器,但我试图理解他们是如何工作的)。我还创建了一个迭代器子类,能够迭代 MyClass 对象的所有元
我想使用 BOOST_FOREACH 宏来迭代我的 vector 中的一堆值。 vector 看起来像这样: struct _Element { int key; // more va
我测试了我的程序,并决定将 BOOST_FOREACH 宏更改为带有 const_iterator 的简单 for 循环。 我收到了意想不到的结果:使用 for 时程序运行速度变慢。 然后我写了一个小
我有一个 BOOST_FOREACH 循环来遍历列表。不幸的是,我还需要将迭代器缓存到特定项。 typedef List::iterator savedIterator; BOOST_FOREACH(
当使用BOOST_FOREACH时,下面的代码安全吗? BOOST_FOREACH (const std::string& str, getStrings()) { ... } ... std::
如果 BOOST_FOREACH 正在迭代的容器在 BOOST_FOREACH 范围内发生更改,会发生什么情况? BOOST_FOREACH 是否“卡住”初始状态? 最佳答案 在这种情况下,行为是未定
考虑以下代码,使用 BOOST_FOREACH 宏迭代一个侵入式列表: #include #include typedef boost::intrusive::list > MyList; voi
来自 boost doc , This results in near-optimal code generation; the performance of BOOST_FOREACH is usu
我有一个场景 vector ,vector .迭代元素的正确方法是什么,是否作为引用? 例如这个: BOOST_FOREACH(Scene scene, mScenes) { .....
我有以下宏: #define FOREACH(decl, c) BOOST_FOREACH(decl, std::make_pair((c).begin(), (c).end())) (我正在使用这个
我想听听您对 BOOST_FOREACH 使用的建议。 我已经阅读了它,因为它是一个非常沉重的标题,但实际上并不推荐它。 此外,它强制使用“break”和“continue”语句,因为您不能真正拥有由
我知道应该最后归咎于 boost 或编译器,但我在这里看不到其他解释。我正在使用 msvc 2008 SP1 和 boost 1.43。 在以下代码片段中,执行永远不会离开 第三个 BOOST_FOR
你可以使用 boost::filesystem 和 BOOST_FOREACH 遍历目录中的所有文件吗?我试过了 path dirPath = ... int fileCount = 0; BOOST
我是一名优秀的程序员,十分优秀!