<i id='xJrtx'><tr id='xJrtx'><dt id='xJrtx'><q id='xJrtx'><span id='xJrtx'><b id='xJrtx'><form id='xJrtx'><ins id='xJrtx'></ins><ul id='xJrtx'></ul><sub id='xJrtx'></sub></form><legend id='xJrtx'></legend><bdo id='xJrtx'><pre id='xJrtx'><center id='xJrtx'></center></pre></bdo></b><th id='xJrtx'></th></span></q></dt></tr></i><div id='xJrtx'><tfoot id='xJrtx'></tfoot><dl id='xJrtx'><fieldset id='xJrtx'></fieldset></dl></div>
<legend id='xJrtx'><style id='xJrtx'><dir id='xJrtx'><q id='xJrtx'></q></dir></style></legend>

    1. <tfoot id='xJrtx'></tfoot>

      <small id='xJrtx'></small><noframes id='xJrtx'>

      • <bdo id='xJrtx'></bdo><ul id='xJrtx'></ul>

      如何在迭代时从 std::set 中删除元素

      How to remove elements from an std::set while iterating over it(如何在迭代时从 std::set 中删除元素)

          <tbody id='riaAp'></tbody>

        <legend id='riaAp'><style id='riaAp'><dir id='riaAp'><q id='riaAp'></q></dir></style></legend>
        • <small id='riaAp'></small><noframes id='riaAp'>

          • <bdo id='riaAp'></bdo><ul id='riaAp'></ul>

          • <i id='riaAp'><tr id='riaAp'><dt id='riaAp'><q id='riaAp'><span id='riaAp'><b id='riaAp'><form id='riaAp'><ins id='riaAp'></ins><ul id='riaAp'></ul><sub id='riaAp'></sub></form><legend id='riaAp'></legend><bdo id='riaAp'><pre id='riaAp'><center id='riaAp'></center></pre></bdo></b><th id='riaAp'></th></span></q></dt></tr></i><div id='riaAp'><tfoot id='riaAp'></tfoot><dl id='riaAp'><fieldset id='riaAp'></fieldset></dl></div>
            <tfoot id='riaAp'></tfoot>
                本文介绍了如何在迭代时从 std::set 中删除元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                如何在迭代时从 std::set 中删除元素

                How can I remove elements from an std::set while iterating over it

                我的第一次尝试看起来像:

                My first attempt looks like:

                set<T> s;
                
                for(set<T>::iterator iter = s.begin(); iter != s.end(); ++iter) {
                    //Do some stuff
                    if(/*some condition*/)
                        s.erase(iter--);
                }
                

                但是如果我们想从集合中删除第一个元素,这是有问题的,因为 iter-- 使迭代器无效.

                But this is problematic if we want to remove the first element from the set because iter-- invalidates the iterator.

                执行此操作的标准方法是什么?

                What's the standard way to do this?

                推荐答案

                标准方式是做类似的事情

                Standard way is to do something like

                for(set<T>::iterator iter = s.begin(); iter != s.end();)
                {
                   if(/*some condition*/)
                   {
                      s.erase(iter++);
                   }
                   else
                   {
                      ++iter;
                   }
                }
                

                根据第一个条件,我们可以确定 iter 无论如何都不会失效,因为 iter 的副本将被传递到 erase,但是我们的 iter 在调用擦除之前已经递增.

                By the first condition we are sure, that iter will not be invalidated anyway, since a copy of iter will be passed into erase, but our iter is already incremented, before erase is called.

                在 C++11 中,代码类似于

                In C++11, the code will be like

                for(set<T>::iterator iter = s.begin(); iter != s.end();)
                {
                   if(/*some condition*/)
                   {
                      iter = s.erase(iter);
                   }
                   else
                   {
                      ++iter;
                   }
                }
                

                这篇关于如何在迭代时从 std::set 中删除元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                Unable to access non-const member functions of objects in C++ std::set(无法访问 C++ std::set 中对象的非常量成员函数)
                How should a size-limited stl-like container be implemented?(应该如何实现大小受限的 stl 类容器?)
                Constructing std::function argument from lambda(从 lambda 构造 std::function 参数)
                STL BigInt class implementation(STL BigInt 类实现)
                Sync is unreliable using std::atomic and std::condition_variable(使用 std::atomic 和 std::condition_variable 同步不可靠)
                Move list element to the end in STL(在 STL 中将列表元素移动到末尾)

                    1. <tfoot id='qa1T1'></tfoot>

                      <small id='qa1T1'></small><noframes id='qa1T1'>

                        <bdo id='qa1T1'></bdo><ul id='qa1T1'></ul>
                            <tbody id='qa1T1'></tbody>
                          <i id='qa1T1'><tr id='qa1T1'><dt id='qa1T1'><q id='qa1T1'><span id='qa1T1'><b id='qa1T1'><form id='qa1T1'><ins id='qa1T1'></ins><ul id='qa1T1'></ul><sub id='qa1T1'></sub></form><legend id='qa1T1'></legend><bdo id='qa1T1'><pre id='qa1T1'><center id='qa1T1'></center></pre></bdo></b><th id='qa1T1'></th></span></q></dt></tr></i><div id='qa1T1'><tfoot id='qa1T1'></tfoot><dl id='qa1T1'><fieldset id='qa1T1'></fieldset></dl></div>

                          <legend id='qa1T1'><style id='qa1T1'><dir id='qa1T1'><q id='qa1T1'></q></dir></style></legend>