奇怪的行为或std :: map :: const_iterator

时间:2012-01-01 17:23:29

标签: c++ map iterator

我正在创建迭代器:

typename Report::container_type_for_processed_files::const_iterator beg = rep.processed_files().begin();
            typename Report::container_type_for_processed_files::const_iterator end = rep.processed_files().end();

我的报告类看起来:

class Report
{
public:
typedef std::map<boost::filesystem3::path,
                 std::pair<unsigned long long/*code*/,
                           unsigned long long/*comment*/> > container_type_for_processed_files;
container_type_for_processed_files processed_files()const;
private:
container_type_for_processed_files processed_files_;
};

cpp中的已处理文件如下所示:

typename Report::container_type_for_processed_files Report::processed_files()const
{
    return processed_files_;
}

但在初始化迭代器之后,如第一行所示:

typename Report::container_type_for_processed_files::const_iterator beg = rep.processed_files().begin();
            typename Report::container_type_for_processed_files::const_iterator end = rep.processed_files().end();
            while (beg != end)
            {
                qDebug() << beg->first.c_str();//here I'm getting runtime error
                fout << "File name: " << (beg->first).c_str();


                ++beg;
            }

我收到错误:传递给C运行时函数的参数无效 在尝试初始化迭代器时,我也在输出窗格上收到消息:
(内部错误:在psymtab中读取pc 0x201,但在symtab中没有。)
这是怎么回事?

2 个答案:

答案 0 :(得分:3)

如果没有可编辑的样本,我不确定这是你的问题,但这看起来很可疑:

container_type_for_processed_files processed_files() const;

你最有可能在那里向容器返回一个const&,否则该函数将返回底层容器的副本(可能是临时的),并且你的迭代器最终会失效(不是同一个对象的迭代器) ,也可能是终身已经结束的临时工的迭代器。)

尝试:

container_type_for_processed_files const& processed_files() const;

答案 1 :(得分:0)

一个问题是rep.processed_files()会返回基础容器的副本。因此,begend适用于两个单独的对象;尝试从一个地图的开头迭代到另一个地图的末尾没有意义 - 它将迭代超过第一个容器的末尾。您应该返回对包含对象的引用。

typename Report::container_type_for_processed_files & Report::processed_files()const
{
    return processed_files_; // Returns by reference
}

当你定义beg和end

时,你需要&
typename Report::container_type_for_processed_files::const_iterator & beg = rep.processed_files().begin();
typename Report::container_type_for_processed_files::const_iterator & end = rep.processed_files().end();

其他问题可能还有其他问题。例如,qDebug是什么?