Почему я не могу поместить итератор в карту? - PullRequest
1 голос
/ 05 февраля 2009

У меня есть карта, определенная так

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 байтов в порядке.

Так что вопрос не в том, как избежать потери итераторов, глупо было хранить их в любом случае, но почему попытка сохранить итератор в начале строки не удалась, и почему то же самое с итераторами в конце работает штраф? В чем разница между ними?

Ответы [ 3 ]

3 голосов
/ 05 февраля 2009

Я не уверен, почему это должно быть проблемой. Я написал этот код для проверки хранения и извлечения итератора, который, кажется, работает нормально. [Примечание: я не использую make_pair, так как он не должен быть релевантным, попробуйте без него!]

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

ожидаемый результат: Итератор для хранения: один Со склада: один

3 голосов
/ 05 февраля 2009

Я не пробовал, но я ожидал, что, конечно, вы можете сохранять значения итератора как значения на карте.

Знаете ли вы, что если вы измените содержимое mHugeString, то любые итераторы в нем, которые вы ранее сохранили, теперь будут недействительными?

Вы можете сохранить индекс в строке вместо итератора.

1 голос
/ 06 февраля 2009

Ничего, вы можете хранить итераторы на карте. Если вы получаете какую-то ошибку, это вызвано чем-то другим. Обратите внимание, что если вы измените вашу строку, итераторы, указывающие на вашу строку, станут недействительными.

Пожалуйста, покажите нам полный, скомпилированный фрагмент кода, который стал непригодным для использования, чтобы мы могли проанализировать его.

...