tags:

views:

42

answers:

1
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;
}

How can I access only one item from the multimap container at a time? I want to update only the jth value in the map, but when I iterate through the map all the bool values are changed. Is there a selective way to access the map container values?

+1  A: 

The line itc->second.second = c_flags[i][j]; performed in a loop with itc from begin() to end() indeed performs assignment to every value of the map. If the goal was to modify only the j'th value in the map, there was no need for a loop over the entire map:

    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;
        }
    }

If this map is used for indexed access in this manner, it may be worthwhile to consider switching to vector, though.

Cubbi
@Cubbi: Thanks this worked. I am using a multimap because the keys represent edges and vertices of a graph. The bool value is a weight that gets assigned to a specific edge-vertx combination, after which another algorithm is executed. Thx
vivekv80
@vivekv80: There is a graph library boost.BGL (http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/table_of_contents.html), which might be useful if this is a long-term project.
Cubbi