我有一个像这样定义的地图
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字节是好的。
所以问题不是如何避免丢失迭代器,无论如何都存储它们是一个愚蠢的想法,但为什么尝试在字符串的开头存储迭代器失败,为什么与最终的迭代器相同精细?他们之间有什么区别?
答案 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)
没关系,你可以在地图中存储迭代器。如果你得到一些错误,那是由其他原因引起的。请注意,如果修改字符串,指向字符串的迭代器将变为无效。
请向我们展示一个完整的,可编辑的代码片段,该代码片段无法使用,因此我们可以对其进行分析。