为什么我不能在地图中放置迭代器?

时间:2009-02-05 16:28:39

标签: c++ string stl map iterator

我有一个像这样定义的地图

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 个答案:

答案 0 :(得分:3)

我没有尝试过,但我本来希望,可以将迭代器值存储为地图中的值。

您是否知道如果您更改mHugeString的内容,那么您先前存储的任何迭代器现在都无效?

您可以选择将索引存储到字符串中,而不是迭代器。

答案 1 :(得分: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;
    }
}

预期产量:  迭代器存储:一个  从存储:一个

答案 2 :(得分:1)

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

请向我们展示一个完整的,可编辑的代码片段,该代码片段无法使用,因此我们可以对其进行分析。