2010-06-29 50 views
0
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; 
} 

Comment puis-je accéder à un seul élément du conteneur multimap à la fois? Je ne veux mettre à jour que la jième valeur de la carte, mais lorsque je parcourt la carte, toutes les valeurs booléennes sont modifiées. Existe-t-il un moyen sélectif d'accéder aux valeurs du conteneur de carte?affecter des valeurs à des éléments sélectifs en utilisant STL multimap

Répondre

1

La ligne itc->second.second = c_flags[i][j]; exécutée dans une boucle avec itc de begin() à end() effectue en effet une affectation à chaque valeur de la carte. Si l'objectif était de ne modifier que la valeur de la carte j-ième, il n'y avait pas besoin d'une boucle sur toute la carte:

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

Si cette carte est utilisée pour l'accès indexé de cette manière, il peut être Cependant, il vaut la peine d'envisager de passer au vecteur.

+0

Merci cela a fonctionné. J'utilise un multimap parce que les clés représentent les arêtes et les sommets d'un graphique. La valeur bool est une pondération affectée à une combinaison spécifique bord-vertx, après laquelle un autre algorithme est exécuté. Thx – vivekv80

+0

@ vivekv80: Il existe une bibliothèque de graphes boost.BGL (http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/table_of_contents.html), ce qui peut être utile si c'est long -Projet final. – Cubbi