Как реализовать большую векторную инициализацию, которая компилируется с gcc-4.4?

У меня есть список из 20 тысяч известных строк, которые я знаю во время компиляции и никогда не изменится. Этакий не настраиваемый словарь. Я не хочу загружать его во время выполнения из файла, потому что это подразумевает много ненужной архитектуры: поиск файла по определенному пути, файл конфигурации для указания пути и т. Д.

Я придумал такое решение в C ++:

В a.cpp:

std::vector<std::string> dic;
dic.reserve(20000);
#define VECTOR_DIC_ dic;
#include values.inl
#undef VECTOR_DIC_

затем в values.inl список из 20 000 вызовов push_back, например:

VECTOR_DIC_.push_back("string1");
VECTOR_DIC_.push_back("string2");
...
VECTOR_DIC_.push_back("string20000");

Этот код компилируется и корректно работает с gcc-4.8 в Debian, но не компилируется с gcc-4.4, gcc-4.4 никогда не завершает компиляцию файла .cpp.

Почему gcc-4.4 не поддерживает этот тип большой инициализации? Кроме того, существует ли шаблон проектирования для такой большой инициализации для известных значений во время компиляции?

1

Решение

Использовать массив const char * и затем инициализируйте ваш вектор из него:

#include <string>
#include <vector>

char const * const S[] = {
"string1",
"string2"};

const std::size_t N_STRINGS = sizeof(S) / sizeof(*S);

const std::vector<std::string> dic(S, S + N_STRINGS);

Это хорошо компилируется (хотя не проверял со строками 20k) с g ++ 4.4.7.

1

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

Компилятор, вероятно, блокируется, потому что инициализация не внутри функции.

Чтобы заставить это работать, вставьте инициализаторы в функцию.

Как в:

std::vector<std::string> dic;  // wouldn't an std::set be a better match?

bool InitDitionary() {
dic.reserve(20000);
#define VECTOR_DIC_ dic;
#include values.inl
#undef VECTOR_DIC_
return true;
}

// you can then call InitDictionary at your discretion from within your app
// or the following line will initialize before the call to main()
bool bInit = InitDictionnary();

Или, альтернатива static const char * также жизнеспособна, вам нужно изменить строковый файл на этот формат, я предлагаю вам включить всю декларацию, так как она, вероятно, генерируется программным обеспечением. Массив должен быть отсортирован заранее, так что вы можете искать его, используя binary_search, upper_bound и т.д ….

const char dic[20000] = {  // <-- optional, in the file, so you have the number of items
"string1",
"string2",
"string3",
"string4",
// ...
};
const size_t DIC_SIZE = sizeof(dic) / sizeof(dic[0]);  // :)

Вы можете либо дать файлу расширение .cpp, либо включить как:

#include "dictionary.inc"
1

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