Rassembler les valeurs identique

Bonjour tous le monde,
J'ai un fichier qui s'affiche comme:
1 9
3 7
12 65
1 4
5 6
11 98
12 22

je veux que mon programme m'affiche:
1 (9,4)
12(65,22)

Merci de m'aider s'il vous plait.

5 réponses

  1. Si je peux l'avoir ce soir c'est bien.
    1. @Chris 94J'avais commencé à utiliser les structures.

      struct CHInfo
      {
       int src;
       int dest;
      };
      
      CHInfo rec;
      rec.src = atoi(netPacket->getSource());
      rec.dest = id;
      CHcandidates.push_back(rec);


      illustration:
      rec.dest rec.src

      1 9
      3 7
      12 65
      1 4
      5 6
      11 98
      12 22

      il faut que je parcourt la colonne rec.dest et recupérer les valeur qui viennent au moins deux fois et de les afficher avec leurs correspondances du colonne 2:
      1 (9,4)
      12(65,22)
  2. J'ai pensé à utiliser les liste chainée ou vector, mais j'y arrive pas.
    1. Contributeur
      Je propose d'utiliser un
      std::map<int, std::vector<int>>
      , ou un
      std::map<int, std::set<int>>
      si les valeurs de la 2e colonne sont uniques par rapport à la valeur de la 1ère colonne.
  3. Bonjour,

    En C++, c'est beaucoup plus simple qu'en C une utilisant la map<> qu'a proposé gravgun.
    std::map<int,std::vector<int>>  donneesClassees;
    
    // classer les éléments à partir de src, leur associer la liste des dest correspondantes
    for ( auto const& rec : CHcandidate )
        donneesClassees[rec.src].push_back( rec.dest );
    
    // il ne reste qu'à tracer chaque élément du dictionnaire qui a plusieurs dest
    for ( auto const& itm : donneesClassees ) {
        if ( itm.second.size() > 1u ) { // plusieurs dest pour un src
            std::cout << itm.first << " (";
            for ( auto idst = itm.second.cbegin() ; ; )
                std::cout << *idst;
                if ( ++idst != itm.second.cend() )
                    std::cout << " , ";  // séparateur avant le prochain
                else
                    break;                   // dernier élément, on arrête
            }
            std::cout << " )\n";
        }
    }
    1. Merci beaucoup de me répondre.
      Dans le bout de code que vous m'avez donner Dalfab, il ne manque pas une accolade ouverte???
      Vous avez mis plus d'accolade fermente que d'accolade ouverte.
    2. Oui, il manque une petite accolade ouvrante ligne 13, à la fin du for ;)
    3. @bayefalleSi je compile, il m'affiche l'erreur suivant:
      expected initializer befor ':' token

      c'est dans les for
      for ( auto const& rec : CHcandidate )
    4. Peut-être que ton compilateur est trop vieux pour supporter les "range-based" for.

      Essaie:
      for (int i = 0 ; i < CHcandidate.size() ; i++)
          donneesClassees[CHcandidate[i].src].push_back( CHcandidate[i].dest );
      

      Ou (au choix)
      for (std::vector<int>::iterator rec = CHcandidate.begin() ; rec < CHcandidate.end() ; rec++)
          donneesClassees[rec->src].push_back( rec->dest );
      


      Il faut aussi que tu fasses la modification pour la deuxième boucle for de ce type.

      Note: j'ai horreur de
      auto
      .