代码之家  ›  专栏  ›  技术社区  ›  Cyrillm_44

在链表c++的同时保持迭代器有效

  •  0
  • Cyrillm_44  · 技术社区  · 6 年前

    有一些关于带有列表的迭代器的文章 here 使用 insert splice here 函数,但我仍然无法为我的情况转换它们,我正在遍历一个列表,如果满足某个条件,我希望将元素拼接(移动)到另一个列表,但如前所述 here 迭代器跳到拼接容器。如何保持迭代器与原始循环相关,如下面的示例所示。

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <map>
    #include <ctime>
    #include <list>
    
    using namespace std;
    
    class Individual {
      public:
        Individual(bool state) : state_(state) {}
        bool my_state(void) {
            return state_;
        }
      private:
        bool state_ = true;
    };
    
    
    int main () {
        cout << "----------Enter Main----------" << endl;
        list<Individual>  list_individuals;
        list<Individual>  cache_list_individuals; 
    
        // initialise
        for (auto i = 0; i < 100; ++i) {
            if (i <= 50)
                list_individuals.push_back(new Individual(true));
            else
                list_individuals.push_back(new Individual(false));
        }
        unsigned counter = 0;
        for (auto iter = list_individuals.begin(); iter != list_individuals.end(); ++iter, ++counter) {
            if ((*iter).my_state()) {
                cache_list_individuals.splice(cache_list_individuals.begin(),list_individuals, iter);
                // I need to make the iterator related to list_individuals not cache_list_individuals
            }
        }
    
        cout << "----------Exit Main----------" << endl;
        system("PAUSE");
        return 0;
    }
    
    2 回复  |  直到 5 年前
        1
  •  0
  •   Kevin Lafayette    5 年前
    for (iter = list.begin(); iter != list.end();) {
        otherIter = iter++;
        if (condition) {
            otherList.splice(otherList.cend(), otherIter, list);
        }
    }
    

    将递增迭代器移动到循环中。 使用后增量,移动iter并保持它在列表中迭代,而otheriter在拼接()后迭代otherlist。

        2
  •  -1
  •   Justsalt    6 年前

    使用循环迭代器的副本进行拼接:

    if ((*iter).my_state()) {
        auto splice_iter = iter;
        cache_list_individuals.splice(cache_list_individuals.begin(), list_individuals, splice_iter);
    }
    

    编辑:向下投票是合理的。复制后,两个迭代器都将指向缓存列表中移动的元素。上面大卫C.兰金的评论是我的代码试图去的地方。