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バイトで問題ありません。

したがって、問題はイテレータの紛失を回避する方法ではなく、とにかくそれらを格納するのは愚かな考えでしたが、文字列の先頭にイテレータを格納しようとすると失敗し、最後のイテレータでも同じことがうまくいくのはなぜですか?それらの違いは何ですか?

4

3 に答える 3

4

私はそれを試したことはありませんが、もちろんイテレータの値を値としてマップに格納できると期待していました。

mHugeString内容を変更すると、以前に格納したイテレータが無効になることをご存知ですか?

イテレータではなく、文字列にインデックスを格納することもできます。

于 2009-02-05T16:35:32.143 に答える
3

なぜ問題になるのかわかりません。このコードを書いて、正常に動作するように見えるイテレータの格納と取得をチェックしました。[注: 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;
    }
}

予想される出力: 格納するイテレータ: one ストレージから: one

于 2009-02-05T16:56:36.250 に答える