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. Modérateur
    Bonjour,

    C'est pour quand ?
    1
    1. Si je peux l'avoir ce soir c'est bien.
      0
      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)
        0
    2. J'ai pensé à utiliser les liste chainée ou vector, mais j'y arrive pas.
      0
      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.
        0
    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";
          }
      }
      0
      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.
        0
      2. Oui, il manque une petite accolade ouvrante ligne 13, à la fin du for ;)
        0
      3. @paly2Merci beaucoup!
        0
      4. @bayefalleSi je compile, il m'affiche l'erreur suivant:
        expected initializer befor ':' token

        c'est dans les for
        for ( auto const& rec : CHcandidate )
        0
      5. 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
        .
        0