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

预期输出:要存储的迭代器:一个来自存储:一个

于 2009-02-05T16:56:36.250 回答
2

没关系,您可以将迭代器存储在地图中。如果你得到一些错误,那是由其他原因引起的。请注意,如果您修改字符串,指向您的字符串的迭代器将变为无效。

请向我们展示一个完整的、可编译的代码片段,该代码片段呈现为不可用,以便我们对其进行分析。

于 2009-02-06T03:26:20.143 回答