【发布时间】:2018-12-19 01:43:55
【问题描述】:
有一些关于迭代器的帖子,列表 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;
}
【问题讨论】:
-
在拼接之前获取下一个迭代器(仍然指向第一个列表)。
-
最容易做到的是将第二个
for更改为while声明第二个iter_tmp并使用std::advance或std::next(C++11) 并分配 @ 987654332@ 在iter上调用advance或next并使用iter_tmp到splice。 -
迭代器指向元素。你移动一个元素,迭代器随之移动。如果你想要一个不移动的迭代器,让它指向一个不移动的元素。