Вопрос
У меня есть мультимап, определяемый
typedef std::pair<int, int> au_pair; //vertices
typedef std::pair<int, int> acq_pair; //ch qlty specified by C
typedef std::multimap<int, acq_pair> au_map;
typedef au_map::iterator It_au;
Нет. моделирования зависят от размера au_map
. Отказ Например: если au_map.size() = 5
У меня будет C1, C2, C3, C4, C5. и, следовательно, 2 ^ 5 = 32 случая.
Например: если au_map.size()=4
, Мне нужно имитировать мой алгоритм для 16 случаев.
for(size_t i = 0; i != 16; ++i)
{
for(It_au it = a_map.begin(); it != a_map.end();)
{
acq_pair it1 = it->second;
//case 0:
//C1 = 0, C2 = 0, C3 = 0, C4 = 0
//@Matthieu M 's suggestion http://stackoverflow.com/questions/3110975/c-case-declaration-closed
//bool const c1 = i & 1;
//bool const c2 = i & 2;
//bool const c3 = i & 4;
//bool const c4 = i & 8;
//Update it1.second with corresponding C values
it->second.second = C1;
it++;
it->second.second = C2;
it++;
it->second.second = C3;
it++;
it->second.second = C4;
it++;
}
//simulate algorithm
}
Как я могу автоматизировать этот процесс, где размер C изменяется в соответствии с au_map.size()
? Таким образом, у меня будет C1, C2, C3, C4, когда au_map.size() = 4
и C1, C2, C3, C4, C5, когда au_map.size() = 5
.
Кроме того, что предпочтительно вектор с этими значениями или добавьте это в пару внутри MultiMap? Время поиска вектор меньше, чем MultiMap.
Кроме того, если я продолжу вставлять значения в MultiMap, будут передаваться новые / обновленные значения в алгоритм?
Решение
Как и другие, я не уверен, что я полностью понимаю ваш вопрос. Похоже, что все, что вам нужно, это представление двоичного каждого целочисленного числа от 0 до 2bits
-1, что вы можете удобно ссылаться (в случаях, которые вы упоминаете, bits
либо 4 или 5, но вы хотите обобщать). Если это так, проще для управления и структуры доступа станет вектор векторов Bool. То есть, вместо того, чтобы использовать std::multimap
, для общих ценностей bits
, заменить std::multimap
с А. std::vector<std::vector<bool> >
... что-то типа:
std::vector<std::vector<bool> > c_flags(1 << bits);
for (size_t i = 0; i < c_flags().size(); ++i)
{
for (size_t j = 0; j < bits; ++j)
c_flags[i].push_back( (i & (1 << j)) > 0);
}
В этот момент, c_flags[i]
Содержит вектор Bools, представляющих двоичные цифры i
куда true
а также false
соответствует 1 и 0 соответственно.
Вы также можете использовать std::map<std::vector<bool> >
вместо std::vector<std::vector<bool> >
Что может снизить требования к памяти (если вам не нужны все возможные двоичные представления) за счет более дорогих вычислений. Я не понимаю, почему вам нужно использовать std::multimap
, но потом у меня нет большого понимания специфики проблемы, которую вы пытаетесь обратиться.
Другие советы
Что такое C1, C2, и так далее? Они просто ints, или строки? В этом случае вы можете автоматически генерировать их, сохраняя переменную счетчика.
Почему вы хотите pair<int,int>
Внутри MultiMap?
Я не понимаю последний вопрос.
Нет неуважения, но вы задаете самые запутанные вопросы. Я должен был укопать ваш предыдущий вопрос, чтобы понять этого немного лучше, и я не уверен, понял ли я также предыдущий вопрос.
Первоначально у меня 4 входа C1, C2, C3, C4. Это означает, что у меня в общей сложности 16 комбинаций:
0000 0001 . . . 1111
Как я могу автоматизировать этот процесс, где размер C изменяется [...
Обычно самый простой способ - писать вложенные петли для генерации комбинаций (я знаю, что это не то, что вы хотите, продолжать читать):
for (int a=0; a < 2; ++a)
{
for (int b=0; b < 2; ++b)
{
for (int c=0; c < 2; ++c)
{
for (int d=0; d < 2; ++d)
{
// I'm just printing the values here but
// you could insert them to a container if
// you want.
cout << a << b << c << d << endl;
}
}
}
}
Однако, если вы не можете определить количество вложенных петель, нам нужно заранее писать (например, если размер C основан на условиях выполнения), затем рассмотрите рекурсивное решение для генерации комбинаций.
void generate_combinations(int depth, int max_depth, string str)
{
if (depth < max_depth)
{
generate_combinations(depth + 1, max_depth, str + "0");
generate_combinations(depth + 1, max_depth, str + "1");
}
else
cout << str << " ";
}
int main()
{
generate_combinations(0, 3, "");
}
Это выходы:
000 001 010 011 100 101 110 111
Пока это:
generate_combinations(0, 4, "");
Выходы:
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
... и так далее. Вы можете контролировать C, однако вам нравится основываться на условиях выполнения и очень легко.
Кроме того, что предпочтительно вектор с этими значениями или добавьте это в пару внутри MultiMap? Время поиска вектор меньше, чем MultiMap.
Если ваши данные плотные (например, индекс в диапазоне от 0 до n без пробелов), то нет причин использовать карту с ключами int. Использование карты с интегральными клавишами полезны только в том случае, если данные, которые вы хотите представлять, является редким. В противном случае рассмотрите STD :: Вектор или STD :: DECE.