0
votes

Comment convertir STD :: Set sur STD :: Carte avec une valeur par défaut en C ++

J'ai un ensemble de clés. Je veux convertir ces clés dans les valeurs de clé d'une carte. Je veux commodément définir chacune des valeurs correspondantes sur la carte de la même valeur (1).

Voici un exemple reproductible. P>

set<string> keys;
keys.insert("key1");
keys.insert("key2");

map<string,int> keys_with_values;
// I want keys_with_values to equal 
     "key1": 1, "key2": 1 


8 commentaires

Oui, vous devez faire boucle à travers l'ensemble, sous une forme ou de la mode, et aussi loin que "quel est le meilleur moyen" de le faire, nous sommes de retour au même problème: Demandez deux développeurs C ++ Quelle est la meilleure façon de Faites X, et vous obtiendrez trois réponses différentes. Vous devez décider que vous-même, en fonction de ce que «meilleur» signifie pour vous.


Domaine de la raison Vous voulez un 1 pas un 0 comme valeur?


C'est pour ce que j'utilise. La carte détient des données sur les mots et leur fréquence dans un post. Ceci est pour initialiser la carte.


Il ressemblerait exactement à toutes les autres boucles dans la langue de programmation C ++. Une déclaration initiale, une condition de boucle et une expression post-itération. Ou une gamme de gamme C ++ 11. Toutes les boucles en C ++ regardent exactement la même chose.


J'ai un ensemble de clés. Je veux convertir ces clés dans les valeurs clés d'une carte - Pourquoi ne pas commencer par une carte? Quelle est la raison de l'ensemble ?


Je lis dans les données d'un CSV et il doit être formaté comme un ensemble. Mais j'ai finalement besoin de ces clés pour être sur une carte.


"La carte détient des données sur les mots et leur fréquence dans un poste. Ceci est destiné à initialiser la carte" Vous n'avez pas besoin d'initialiser la carte, il suffit de commencer à compter sur 0


Et il doit être formaté comme un ensemble sonne comme une application de votre professeur ou de votre superviseur. Il n'y a pas besoin d'un définir pour cela. Ne sait pas à quoi ressemble votre code, je parie une tasse de café que vous auriez pu ignorer de lire dans un ensemble et simplement lire dans la carte.


3 Réponses :


0
votes

Merci, @sam Varshavchik --Here est comment j'ai implémenté la boucle

 set<string> keys;
 keys.insert("key1");
 keys.insert("key2");
 map<string,int> keys_with_values;
 for(auto key : keys) {
     keys_with_values[key] = 1;
 }
 cout << keys_with_values["key1"]; // 1


1 commentaires

En respectant le commentaire Diversittie C ++ de Sam, vous pouvez également faire keys_with_values.insert ({clé, 1}) :-)



0
votes

Je veux ajouter une autre manière, très c ++ - y de faire cela:

#include <set>
#include <map>
#include <iterator>
#include <string>
#include <algorithm>

int main () {
    std::set<std::string> keys;
    keys.insert("key1");
    keys.insert("key2");

    std::map<std::string,int> keys_with_values;
    std::transform(keys.cbegin(), keys.cend(), std::inserter(keys_with_values, begin(keys_with_values)), [] (const std::string &arg) { return std::make_pair(arg, 1);});
}


0 commentaires

0
votes

Voici une autre solution à l'aide de Lambdas: xxx pré>

et pour l'assurance complet, voici l'un à l'aide d'itérateurs: P>

set<string>::iterator it = keys.begin();
while (it != keys.end())
{
    keys_with_values.insert({ *it, 1});
    it++;
}


0 commentaires