Для C++ карта работает хорошо. Несколько миллионов объектов не будут проблемой. 10 миллионов объектов заняли приблизительно 4,4 секунды и приблизительно 57 meg на моем компьютере.
Мое тестовое приложение следующие:
#include <stdio.h>
#include <stdlib.h>
#include <map>
class triple {
public:
int x;
int y;
int z;
bool operator<(const triple &other) const {
if (x < other.x) return true;
if (other.x < x) return false;
if (y < other.y) return true;
if (other.y < y) return false;
return z < other.z;
}
};
int main(int, char**)
{
std::map<triple,int> data;
triple point;
int i;
for (i = 0; i < 10000000; ++i) {
point.x = rand();
point.y = rand();
point.z = rand();
//printf("%d %d %d %d\n", i, point.x, point.y, point.z);
data[point] = i;
}
return 0;
}
Теперь для динамичного выбора количества переменных самое легкое решение состоит в том, чтобы представить индекс как строка , и затем использовать строку в качестве ключа для карты. Например, объект, расположенный в [23] [55], может быть представлен через "23,55" строка. Мы можем также расширить это решение для более высоких размеров; такой что касается трех измерений произвольный индекс будет похож "34,45,56". Простая реализация этой техники следующие:
std::map data<string,int> data;
char ix[100];
sprintf(ix, "%d,%d", x, y); // 2 vars
data[ix] = i;
sprintf(ix, "%d,%d,%d", x, y, z); // 3 vars
data[ix] = i;
Чтобы быть педантичным, есть 8 различных допустимых опций -O, которые вы можете передать gcc, хотя некоторые из них означают то же самое.
В исходной версии этого ответа указывалось, что существует 7 вариантов. GCC с тех пор добавил -Og
, чтобы довести общее количество до 8
Из справочной страницы :
-O
(То же, что -O1
) -O0
(без оптимизации, по умолчанию, если не указан уровень оптимизации) -O1
(оптимизировать минимально) -O2
(оптимизировать больше) -O3
(оптимизируйте еще больше) -Ofast
(оптимизируйте очень агрессивно, вплоть до нарушения соответствия стандартам) -Og
(Оптимизируйте процесс отладки. -Og включает оптимизацию, которая не мешает отладка. Это должно быть
уровень оптимизации для стандартного цикла редактирования-компиляции-отладки, предлагающий разумный уровень оптимизации
при сохранении быстрой компиляции и хорошего опыта отладки.) -Os
(Оптимизация по размеру. -Os
включает все оптимизации -O2
, которые обычно не увеличивают размер кода . Он также выполняет дальнейшую оптимизацию
разработан для уменьшения размера кода.
-Os
отключает следующие флаги оптимизации: -falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop- array -ftree-vect-loop-version
) Также могут быть оптимизации для конкретных платформ, как отмечает @pauldoo, OS X имеет -Oz
Четыре (0-3): См. Руководство GCC 4.4.2 . Все, что выше, равно -O3, но в какой-то момент вы превысите ограничение на размер переменной.