Вопрос

У меня есть мультимап, определяемый

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top