C ++ Вложенная карта и дублирование - PullRequest
0 голосов
/ 04 апреля 2019

Я запускаю алгоритм на C ++, основанный на вычислении двоичного дерева с итерацией и индукцией.

Для этой цели я вложил карту, как это

typedef map<double, bool> b1d;
typedef map<double, b1d> mb2d;
typedef vector<mb2d> vb3d;

typedef map<double, double> m1d;
typedef map<double, m1d> m2d;
typedef vector<m2d> v3d;

m2d ZY;
v3d * V = new v3d (n+1, m2d(ZY));

mb2d ZYb;
vb3d * Vb = new vb3d (n+1, mb2d(ZYb));

, и я изменяю значения следующим образомчто

(*J_tab)[K+1.0][Z+y][W - 1.0/sqrt((double) n)] = V_tmp;
(*J_bool)[K+1.0][Z+y][W - 1.0/sqrt((double) n)] = true;

Проблема в Я получаю много дубликатов, и это странно для std :: map , как вы можете видеть на этой картинке, которую я получил с помощью моего отладчика Debugger На этой картинке вы можете видеть во второй степени множество повторений, например, 0,6 или 0,7, а в третьей степени - в 0,3.

Единственный способ избавиться от найденного мной дублирования - этоЗамените double на строку, т.е.

typedef map<string, bool> b1d;
typedef map<string, b1d> mb2d;
typedef vector<mb2d> vb3d;

и выполняйте эти операции

            std::string strZy, strWm, strWp;
            std::ostringstream strsZy, strsWm, strsWp;
            int precision = 5;
            strsZy << fixed << setprecision(precision) << Z+y;
            strsWp << fixed << setprecision(precision) << W + 1.0/sqrt((double) n);
            strsWm << fixed << setprecision(precision) << W - 1.0/sqrt((double) n);
            strZy = strsZy.str();
            strWm = strsWm.str();strWp = strsWp.str();

Однако я думаю, что это занимает больше памяти, чем удвоение и больше времени, поэтому это не самое эффективное решение.

Кто-то знает, как это исправить?или другой элегантный способ сделать это?

...