【发布时间】:2010-08-23 22:17:12
【问题描述】:
我有一个std::map<int,int>,我们称之为my_map
我使用迭代器和 for 循环遍历这个映射。
在每次迭代中,我想修改此映射中的许多元素,但将其再次恢复为原始值以供循环的下一次迭代使用。
我以为我可以创建迭代器 my_temp_map 的临时副本,但是我无法使用迭代器找到我应该处理的元素。
然后我想我可以创建一个临时副本,在原点 my_map 上工作,并在每个循环结束时将原始副本恢复到临时副本。但是我相信这会使迭代器无效,因为分配会删除所有元素
如何解决这个问题?
已添加代码
所以每个内部循环都会修改 current_partition(并且还有一些缺少的代码将存储修改后的 current_partition 的结果),但是在每个 inner_loop 之后我需要将 current_loop 恢复到它以前的自我。
std::map<int,int> current_partition = bitset_to_map(centre->second->bit_partitions);
int num_parts = (std::max_element(current_partition.begin(), current_partition.end(),value_comparer))->second;
for (std::map<int,int>::iterator itr = current_partition.begin(); itr != current_partition.end(); ++itr) {
for (int next_part = 0; next_part<num_parts+1; ++next_part) {
if (next_part != itr->second) {
int current_part = itr->second;
itr->second = next_part;
std::vector<int> first_changed_part, last_changed_part;
for (std::map<int,int>::iterator new_itr = current_partition.begin(); new_itr != current_partition.end(); ++new_itr) {
if (new_itr->second == current_part)
first_changed_part.push_back(new_itr->first);
if (new_itr->second == next_part)
last_changed_part.push_back(new_itr->first);
}
}
}
}
【问题讨论】:
-
你的问题没有多大意义。整个前提有点奇怪(您正在修改一堆数据然后丢弃它?),但主要问题是您一直在说“迭代器”并且不清楚您指的是哪些迭代器。在您的第一个示例中,您当然可以在
my_temp_map中使用迭代器来做您想做的事情——您是在谈论其他迭代器吗?在第二个示例中,您担心哪些迭代器会失效?一些代码(或伪代码)在这里可能会有所帮助。