присвойте значения выбранным элементам, используя мультикарту STL

typedef std::pair<int, bool> acq_pair; //edge, channel_quality
typedef std::pair<int, acq_pair> ac_pair;
typedef std::multimap<int, acq_pair> ac_map;
typedef ac_map::iterator It_acq;


int bits = acq_map.size();
std::cout << "bits = " << bits << std::endl;

std::vector<std::vector<bool> > c_flags (1 << bits);

for (i = 0; i < c_flags.size(); ++i)
{
    for (j = 0; j < bits; ++j)
    {
        c_flags[i].push_back( (i & (1 << j)) > 0);      
    }           
}

std::cout << "c_flags.size() = " << c_flags.size() << std::endl;

for(i = 0; i < c_flags.size(); ++i)
{
    for(j = 0; j < bits; ++j)
    {
        std::cout << c_flags[i][j] << std::endl;

        for(It_acq itc = acq_map.begin(); itc!= acq_map.end(); ++itc)
        {
            acq_pair it1 = itc->second;
            itc->second.second = c_flags[i][j];
            std::cout << itc->first << " : " << it1.first << " : " << it1.second << std::endl;
        }
    }   
    std::cout << "\n" << std::endl;
}

Как я могу получить доступ только к одному элементу из мультимап-контейнера за раз? Я хочу обновить только j-е значение на карте, но когда я перебираю карту, все логические значения меняются. Есть ли выборочный способ доступа к значениям контейнера карты?


person vivekv80    schedule 29.06.2010    source источник


Ответы (1)


Строка itc->second.second = c_flags[i][j];, выполняемая в цикле с itc от begin() до end(), действительно выполняет присваивание каждому значению карты. Если целью было изменить только j-е значение на карте, не было необходимости в цикле по всей карте:

    for(size_t j = 0; j < bits; ++j)
    {
        std::cout << c_flags[i][j] << std::endl;

        It_acq itc = acq_map.begin(); // itc points at the beginning
        advance(itc, j); // itc points at the j'th element
        itc->second.second = c_flags[i][j]; // the assignment

        for(It_acq itc = acq_map.begin(); itc!= acq_map.end(); ++itc)
        {
            acq_pair it1 = itc->second;
//            itc->second.second = c_flags[i][j];   // no assignment here
            std::cout << itc->first << " : " << it1.first << " : " << it1.second << std::endl;
        }
    }

Если эта карта используется для индексированного доступа таким образом, возможно, стоит подумать о переходе на вектор.

person Cubbi    schedule 29.06.2010
comment
Спасибо, это сработало. Я использую мультикарту, потому что ключи представляют ребра и вершины графа. Логическое значение — это вес, который присваивается определенной комбинации ребер и вершин, после чего выполняется другой алгоритм. Спасибо - person vivekv80; 29.06.2010
comment
@vivekv80: есть библиотека графов boost.BGL (boost.org/doc/libs/1_43_0/libs/graph/doc/table_of_contents.html), что может быть полезно, если это долгосрочный проект. - person Cubbi; 30.06.2010