2010-08-23 69 views
1

我有一個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); 
      } 
     } 
    } 
} 
+0

你的問題不作一大堆的道理。整個前提有點奇怪(你正在修改一堆數據,然後丟棄它),但主要問題是你一直在說「迭代器」,並不清楚你的意思是哪個迭代器。在你的第一個例子中,你當然可以在my_temp_map中使用迭代器來做你想做的事情 - 你在談論其他的迭代器嗎?在第二個例子中,哪些迭代器擔心無效?一些代碼(或僞代碼)在這裏可能會有所幫助。 – 2010-08-23 22:22:09

回答

1

我認爲std :: advance可能有幫助。創建temp,然後提前開始(),直到你現在在哪裏(用std :: distance找到)......然後不管你想要做什麼。

+0

或者,如果您不需要在當前迭代器位置之前更改項目,則可以創建僅包含從當前位置到末尾的元素(使用以迭代器作爲參數的構造函數)的臨時映射。 – TreDubZedd 2010-08-23 22:29:34

0

隨着代碼,我明白你現在要做什麼。我會這麼做,第一種方式是建議:每次通過外部循環時,製作current_partition數據結構的臨時副本,然後處理它,最後丟棄它。

你說這個問題會導致你無法在原始圖中使用迭代器來查找你應該使用的元素。確實如此;你不能直接這樣做。但它是一個地圖。您正在處理的元素將有一個,它們在數據結構的任何副本中都是相同的,因此您可以使用它來爲您應該在副本中處理的元素創建迭代器。

例如:

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) { 

    // Make a temporary copy of the map. Iterators between the original and the copy aren't 
    // interchangeable, but the keys are. 

    std::map<int,int> tmp_current_partition = current_partition; 

    // Use the iterator itr to get the key for the element you're working on (itr->first), 
    // and then use that key to get an equivalent iterator into the temporary map using find() 

    std::map<int,int>::iterator tmp_itr = tmp_current_partition.find(itr->first); 

    // Then just replace current_partition with tmp_current_partition and 
    // itr with tmp_itr in the remainder (hopefully I didn't miss any) 

    for (int next_part = 0; next_part<num_parts+1; ++next_part) { 
     if (next_part != tmp_itr->second) { 
      int current_part = tmp_itr->second; 
      tmp_itr->second = next_part; 

      std::vector<int> first_changed_part, last_changed_part; 
      for (std::map<int,int>::iterator new_itr = tmp_current_partition.begin(); new_itr != tmp_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); 
      } 
     } 
    } 
}