c++ - 无序映射的堆栈溢出

标签 c++ stl stack-overflow

对于一个项目,我有一个开始表,我决定将其放入 std::unordered_map 中。不幸的是,我仅限于对整个 map 进行硬编码。因此,我决定将初始化拆分为多个文件。

class OpeningBook
{
public:
    OpeningBook();
private:
    std::unordered_map<std::string, int> opening_database_;
    void init1();
    void init2();
    void init3();
    void init4();
    void init5();
};

构造函数只调用 init 函数:

OpeningBook::OpeningBook()
{
    init1();
    init2();
    init3();
    init4();
    init5();
}

所有这些看起来都是这样的:

void OpeningBook::init1()
{
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000001100000-1-1000",5000));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100000-1-1100",5000));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100001-1-1000",5000));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100000-1-1010",5000));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100010-1-1000",5000));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100000-1-1001",5000));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-100000010000-11-1000",0));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-100000010000-10-1100",5000));
    // continues
}

但是,一旦我的代码碰到 init1() 中的左大括号,它就会抛出堆栈溢出异常。我认为不会发生堆栈溢出,因为 unordered_map 在堆上。这是怎么回事?我该怎么做才能解决这个问题?

最佳答案

您在每个 initx() 方法中插入了多少项?如果数以千计,则编译器生成的代码可能会使用堆栈上的大量临时对象,并且只是请求比可用堆栈空间更多的堆栈空间。

尝试进一步拆分您的初始化方法,看看是否能解决问题。

更好的方法可能是有一个包含初始化数据的表:

static const struct {
    const char *str;
    int n;
} DatabaseInitData[] = {
    {"0001000000-10000001000000-1000001100000-1-1000",5000},
    {"0001000000-10000001000000-1000000100000-1-1100",5000},
    {"0001000000-10000001000000-1000000100001-1-1000",5000},
    // etc
};

然后,在你的构造函数中:

OpeningBook::OpeningBook()
{
    for (int i = 0; i < sizeof(DatabaseInitData)/sizeof(DatabaseInitData[0]); i++) {
        opening_database_.insert(std::pair<std::string, int>(
            DatabaseInitData[i].str,
            DatabaseInitData[i].n));
    }
}

关于c++ - 无序映射的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13501257/

相关文章:

c++ - 我的逻辑在哪里失败?

c++ - std::fstream 不创建文件

c++ - 给定复制构造的要求,如何在 C++11 中编写有状态分配器?

recursion - 为什么永远的循环不会崩溃?为什么无限递归会崩溃?

java - Java计算第10001个素数时栈溢出

c++ - 为什么我会收到 glibc 错误?

c++ - 调用 cin.get() 两次 : unexpected result?

c# - 在 C# 中定义集合访问器时如何避免堆栈溢出错误

c++ - “封闭”友元类的范围

c++ - 如何更好地使用 STL 和仿函数来获得滑动窗口最小值的解决方案