Ma fonction ressemble à ceci:

bool getPair(std::vector<std::vector<unsigned short>>Cards) {
std::sort(Cards.begin(), Cards.end(), Cardsort);
std::map<unsigned short, int>Counter;
for (int i = 0; i < 6; i++)
    Counter[Cards[i][0]];
for (const auto& val : Counter) {
    if (val.second == 2)
        return true;
}
return false;
}

Je suis presque sûr que j'utilise std::map de manière incorrecte, j'ai fondamentalement la configuration vectorielle comme suit:

{{2,0},{3,0},{4,1},{3,0},{4,0},{5,0},{6,0}}

Où le premier nombre représente la valeur, le second représente la couleur de la carte. Je me rends compte maintenant que j'aurais dû utiliser un objet qui aurait peut-être rendu ce problème moins compliqué, mais maintenant j'essaye d'utiliser std::map pour compter le nombre de fois où la valeur apparaît et si elle apparaît deux fois, elle affiche le retour true (dans le vecteur, il renverrait true au 3) mais je ne pense pas que j'utilise std::map correctement

Je veux voir si Cards a plusieurs variables identiques dans Cards [i] [0], je ne me soucie pas des doublons dans Cards [i] [1]

0
Ginzo Milani 26 août 2017 à 22:21

2 réponses

Testé cela et fonctionne. A mis en évidence le correctif

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

bool getPair(std::vector<std::vector<unsigned short>>Cards) {
std::sort(Cards.begin(), Cards.end());
std::map<unsigned short, int>Counter;
for (int i = 0; i < 6; i++)
    Counter[Cards[i][0]]++;   // ++++++++++++++++++ need to alter the value!
for (const auto& val : Counter) {
    if (val.second == 2)
        return true;
}
return false;
}

int main() {
    // your code goes here
    // {{2,0},{3,0},{4,1},{3,0},{4,0},{5,0},{6,0}}
    std::vector<std::vector<unsigned short>> c = {{2,0},{3,0},{4,1},{3,0},{4,0},{5,0},{6,0}};
    std::cout << getPair(c);
    return 0;
}
2
Marcin Gałczyński 26 août 2017 à 20:39

Tout d'abord, vous adressez des variables non initialisées dans Counter, puis vous ne faites rien avec lui (et pourquoi exécutez-vous jusqu'à 6 au lieu de Cards.size ()? Votre tableau a la taille 7 BTW. Aussi pourquoi il y a une sorte de trier ici? Vous n'en avez pas besoin.):

std::map<unsigned short, int>Counter;
for (int i = 0; i < 6; i++)
     Counter[Cards[i][0]];

Ils peuvent définir automatiquement la variable non initialisée à 0 ou non - cela dépend de l'implémentation car elle n'est pas spécifiée pour autant que je sache (dans Debug, ils la définissent sur 0 mais je doute de la version Release). Vous devrez réécrire le code comme suit pour qu'il fonctionne à 100% dans toutes les circonstances:

std::map<unsigned short, int> Counter;
for (int i = 0; i < (int)Cards.size(); i++)
{
    unsigned short card = Cards[i][0];

    auto itr = Counter.find(card);
    if(itr == Counter.end())
         Counter[card] = 1;
    else
         itr->second++;
}

Je recommanderais d'utiliser std :: set pour cette tâche:

std::set<unsigned short> Counter;
for (int i = 0; i < (int)Cards.size(); i++)
{
    unsigned short card = Cards[i][0];
    if(Counter.count(card)>0)
    {
          return true;
    }
    Counter.insert(card);
}
return false;
0
26 août 2017 à 20:49