2009-02-05 14 views
1

J'ai une carte définie comme celui-ciPourquoi ne puis-je pas mettre un itérateur sur la carte?

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

Et une énorme chaîne nommée « mHugeString ». Ensuite, je marcher à travers la chaîne de collecte itérateurs comme ceci:

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

En fin de compte je recevoir une carte, où un itérateur est associée à une certaine sorte de clé. Mais l'itérateur se perd en quelque sorte lorsqu'il est associé à une clé par "make_pair", à moins qu'il ne pointe vers un endroit à la fin d'une chaîne. C'est difficile à dire, mais peut-être que les 256 derniers octets sont bien. Donc, la question n'est pas de savoir comment éviter de perdre des itérateurs, c'était une idée stupide de les stocker de toute façon, mais pourquoi essayer de stocker un itérateur au début de la chaîne échoue, et pourquoi la même chose avec les itérateurs à la fin fonctionne bien? Quelle est la différence entre eux?

+0

Comment conserver un itérateur? Est-ce 'mIteratorMap.insert (Carte :: value_type (key_of_a_right_type, It)), ou' 'mIteratorMap [key_of_a_right_type] = Il;'? – jfs

+0

Pouvez-vous mettre à jour votre pseudo-code pour clarifier comment vous insérez dans la carte? Cela donne l'impression que vous construisez un temporaire mais ce n'est pas un appel ctor valide: if (need_to_store_an_iterator) mIteratorMap (key_of_a_right_type, It); –

+0

Mon mauvais, l'a réparé. Mais l'insertion fonctionne de la manière d'économiser. Même en essayant simplement de faire une paire échoue. – akalenuk

Répondre

3

Je ne l'ai pas essayé mais je m'attendais à ce que, bien sûr, peut stocker les valeurs de l'itérateur comme valeurs dans une carte. Savez-vous que si vous changez le contenu de mHugeString, alors les itérateurs que vous avez précédemment stockés sont maintenant invalides?

Vous pouvez choisir de stocker l'index dans la chaîne, au lieu de l'itérateur.

+0

Oui, et je m'attendais à la même chose. On dirait que quelque chose ne va pas avec une implémentation de "make_pair". – akalenuk

3

Je ne sais pas pourquoi il devrait être un problème. J'ai écrit ce code pour vérifier le stockage et la récupération de l'itérateur qui semble fonctionner correctement.

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

Résultats escomptés: [Note Je n'utilise pas make_pair comme il ne devrait pas être pertinent, donner essayer sans l'utiliser si!]: Iterator pour stocker: un De stockage: un

+0

Je n'ai pas non plus de problème avec une petite chaîne. Le problème se produit lorsque vous essayez de stocker un itérateur loin de la fin de la chaîne. – akalenuk

+0

Qu'entendez-vous par "loin de la fin"? Utilisez-vous l'itérateur inverse? Les itérateurs sont essentiellement des ptrs et ne devraient donc pas avoir de limitation. Etes-vous sûr de ne pas corrompre votre stockage ou quelque chose? Quelle est la taille de vos cordes? – Ketan

1

Il est très bien , vous pouvez itérateurs stocker dans la carte. Si vous obtenez une erreur, cela est causé par autre chose. Notez que si vous modifiez votre chaîne, les itérateurs pointant sur votre chaîne deviendront invalides.

S'il vous plaît nous montrer un extrait de code complet, compilable qui est rendu inutilisable, donc nous pouvons l'analyser.