2009-02-05 160 views
1

我有這樣爲什麼我不能在地圖中放置迭代器?

std::map<some_key_type, std::string::iterator> mIteratorMap; 

,並命名爲「mHugeString」一個巨大的字符串來定義的映射。然後,我走線槽串收集迭代器是這樣的:

std::string::iterator It=mHugeString.begin(); 
std::string::iterator EndIt=mHugeString.end(); 
for(;It!=EndIt;++It){ 
    ...defining a key element... 
    if(need_to_store_an_iterator)mIteratorMap[key_of_a_right_type]=It; 
} 

到底我應該收到一個地圖,其中一個迭代器與某種關鍵的關聯。但是,迭代器在通過「make_pair」與鍵配對時會自動鬆開,除非它指向某個字符串末尾的某個位置。很難說,但最後256個字節也可以。

所以問題不在於如何避免丟失迭代器,反正存儲它們是一個愚蠢的想法,但爲什麼試圖在字符串開始時存儲迭代器失敗,以及爲什麼與迭代器相同工作正常?他們有什麼區別?

+0

如何存儲迭代器?它是`mIteratorMap.insert(Map :: value_type(key_of_a_right_type,It));`或`mIteratorMap [key_of_a_right_type] =它;`? – jfs 2009-02-05 16:41:57

+0

你能否更新你的僞代碼來闡明你如何插入地圖?這使得它看起來像是構建一個臨時的,但它不是一個有效的ctor調用: if(need_to_store_an_iterator)mIteratorMap(key_of_a_right_type,It); – 2009-02-05 16:42:04

+0

我的不好,修好了。但插入工作的保存方式。即使只是試圖讓一對失敗。 – akalenuk 2009-02-05 16:47:50

回答

3

我還沒有嘗試過,但我會預料到的,當然你可以可以將迭代器值作爲值存儲在地圖中。

你知道嗎,如果你改變mHugeString的內容,那麼你以前存儲的任何迭代器現在都是無效的?

您可能選擇將索引存儲到字符串中,而不是迭代器。

3

我不知道爲什麼它應該是問題。我編寫了這個代碼來檢查存儲和檢索迭代器,似乎工作正常。

#include <string> 
#include <iostream> 
#include <map> 

enum UniqueKey {One, Two, Three}; 

typedef std::map<UniqueKey, std::string::iterator> UniqueKeyStringMap; 

int main() 
{ 
    UniqueKeyStringMap storage; 

    std::string stringOne = "This is one string"; 

    std::string::iterator it = stringOne.begin() + 8; // "o" 
    std::cout << " Iterator to store: " << std::string(it, it + 3) << std::endl; 

    storage[UniqueKey::One] = it; // Store iterator 

    // Retrieve and print, string and map are valid 

    UniqueKeyStringMap::iterator mapIter = storage.find(UniqueKey::One); 
    if (mapIter != storage.end()) 
    { 
     std::cout << " From storage: " << 
      std::string(mapIter->second, mapIter->second + 3) << std::endl; 
    } 
} 

預期輸出:注意我沒有使用make_pair,因爲它不應該是相關的,給予嘗試沒有,雖然使用它!]: 迭代器來存儲:一個 從存儲:一個

1

沒關係,你可以在地圖上存儲迭代器。如果你得到一些錯誤,那是由別的東西引起的。請注意,如果您修改字符串,指向您字符串的迭代器將變爲無效。

請給我們展示一個完整的,可編譯的代碼片段,使其不可用,所以我們可以分析它。

相關問題