C ++ case multimap - PullRequest
       42

C ++ case multimap

0 голосов
/ 28 июня 2010

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

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.

Кроме того, что предпочитает вектор с этими значениями или добавить это в пару внутри мультикарты?Время поиска вектора меньше, чем в мультикарте.

Кроме того, если я продолжу вставлять значения в мультикарту, будут ли новые / обновленные значения передаваться алгоритму?

Ответы [ 3 ]

1 голос
/ 28 июня 2010

Как и другие, я не уверен, что полностью понимаю ваш вопрос.Похоже, все, что вам нужно, это представление двоичного файла каждого целого числа от 0 до 2 bits -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 <&lt j)) > 0);
}

В этот момент c_flags[i] содержит вектор bools, представляющий двоичные цифры i, где true и false соответствуют 1 и 0. соответственно.

Вы также можете использовать std::map<std::vector<bool> > вместо std::vector<std::vector<bool> >, которыйможет снизить требования к памяти (если вам не нужны все возможные двоичные представления) за счет того, что вычислительно дороже.Я не понимаю, почему вам нужно использовать std::multimap, но тогда у меня нет особого понимания специфики проблемы, которую вы пытаетесь решить.

0 голосов
/ 28 июня 2010

Неуважительное намерение, но вы задаете самые запутанные вопросы.Мне пришлось выкопать ваш предыдущий вопрос, чтобы понять его немного лучше, и я не уверен, понял ли я также предыдущий вопрос.

Изначально у меня есть 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 любым удобным для вас образом, основываясь на условиях выполнения, и очень легко.

Кроме того, что предпочитает вектор с этими значениями или добавить это в пару внутри мультикарты?Время поиска вектора меньше, чем в мультикарте.

Если ваши данные плотные (например, индексы в диапазоне от 0 до N без пробелов), то нет необходимости использовать карту с ключами int.Использование карты со встроенными ключами полезно только в том случае, если данные, которые вы хотите представить, являются разреженными.В противном случае рассмотрим std :: vector или std :: deque.

0 голосов
/ 28 июня 2010

Что такое C1, C2 и так далее? Это просто целые или строчки? В этом случае вы можете автоматически сгенерировать их, сохранив переменную counter.
Зачем вам pair<int,int> внутри мультикарты?
Я не понимаю последний вопрос.

...