【问题标题】:Why can't I put an iterator in map?为什么我不能在地图中放置迭代器?
【发布时间】:2009-02-05 16:28:38
【问题描述】:

我有一张这样定义的地图

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 个字节没问题。

所以问题不在于如何避免丢失迭代器,无论如何存储它们是一个愚蠢的想法,但为什么尝试在字符串开头存储迭代器会失败,以及为什么与最后的迭代器相同美好的?它们有什么区别?

【问题讨论】:

  • 如何存储迭代器?是mIteratorMap.insert(Map::value_type(key_of_a_right_type, It)); 还是mIteratorMap[key_of_a_right_type] = It;
  • 您能否更新您的伪代码以阐明您是如何插入到地图中的?这使它看起来像您正在构建一个临时的,但它不是一个有效的 ctor 调用: if(need_to_store_an_iterator)mIteratorMap(key_of_a_right_type, It);
  • 我的错,修好了。但是插入是保存方式。即使只是尝试配对也失败了。
  • 简短的回答是您可以将迭代器存储在地图中。但是如果没有一些工作代码来解决问题,就不可能诊断出问题。

标签: c++ string stl map iterator


【解决方案1】:

我没有尝试过,但我希望您当然可以将迭代器值存储为映射中的值。

你知道如果你改变mHugeString的内容,那么你之前存储的任何迭代器现在都无效了吗?

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

【讨论】:

  • 是的,我也有同样的期望。 “make_pair”的实现似乎有问题。
【解决方案2】:

我不确定为什么会出现问题。我编写了这段代码来检查似乎工作正常的迭代器的存储和检索。 [注意:我没有使用 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;
    }
}

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

【讨论】:

  • 我对小字符串也没有问题。尝试将迭代器存储在远离字符串末尾的位置时会出现此问题。
  • “远未结束”是什么意思?你在使用反向迭代器吗?迭代器基本上是ptrs,所以不应该有任何限制。你确定你没有破坏你的存储或其他东西吗?你的琴弦有多大?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多