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

Strange behavior or std::map::const_iterator

本文关键字:iterator map const std      更新时间:2023-10-16

我正在创建迭代器:

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();

my Report class looks:

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运行时函数的参数无效。
当尝试初始化迭代器时,我也在输出窗格上获得消息:
(内部错误:pc 0x201在读取psymtab,但没有在symtab)
这是怎么呢

没有可编译的示例,我不确定这是您的问题,但这看起来很可疑:

container_type_for_processed_files processed_files() const;

你应该很有可能返回一个const&到那里的容器,否则该函数将返回(可能是临时的)底层容器的副本,并且你的迭代器将最终无效(不是对同一对象的迭代器,可能是对生命周期已经结束的临时对象的迭代器)。

试一试:

container_type_for_processed_files const& processed_files() const;

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

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