Переполнение стека с неупорядоченной картой

Для проекта у меня есть начальный стол, который я решил положить в std::unordered_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 находится в куче. В чем дело? и что я могу сделать, чтобы это исправить?

1

Решение

Сколько предметов вы вставляете в каждый 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));
}
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]