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

在链表C++的同时保持迭代器有效,c++,iterator,splice,C++,Iterator,Splice,关于迭代器,有几篇文章使用insert和splice函数列出了列表,但我仍然无法翻译它们。我在一个列表中进行迭代,如果满足条件,我想将元素拼接到另一个列表中,但如上所述,迭代器跳转到拼接容器。如何保持迭代器与原始循环相关,如下面的示例所示 #include <iostream> #include <algorithm> #include <vector> #include <string> #include <map> #include

关于迭代器,有几篇文章使用insert和splice函数列出了列表,但我仍然无法翻译它们。我在一个列表中进行迭代,如果满足条件,我想将元素拼接到另一个列表中,但如上所述,迭代器跳转到拼接容器。如何保持迭代器与原始循环相关,如下面的示例所示

#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;
}

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

if ((*iter).my_state()) {
    auto splice_iter = iter;
    cache_list_individuals.splice(cache_list_individuals.begin(), list_individuals, splice_iter);
}
编辑:否决票是正当的。复制后,两个迭代器都将指向缓存列表中移动的元素。David C.Rankin在上面的评论就是我的代码试图达到的目的

for (iter = list.begin(); iter != list.end();) {
    otherIter = iter++;
    if (condition) {
        otherList.splice(otherList.cend(), otherIter, list);
    }
}
将递增迭代器移动到循环中。
使用post增量,移动iter,并使其在列表中迭代,当otherIter在拼接后遍历otherList时。

在拼接前,让下一个迭代器仍指向第一个列表。在声明第二个iter\u tmp时,将第二个iter更改为a,并使用std::advance或std::next C++11并指定iter\u tmp=iter;在调用iter上的advance或next并使用iter_tmp拼接之前,迭代器指向元素。移动一个元素,迭代器随之移动。如果你想要一个不移动的迭代器,让它指向一个不移动的元素。