web-dev-qa-db-fra.com

Insérer un vecteur pour la valeur dans la carte en C ++

Je suis coincé à essayer de comprendre comment insérer un vecteur pour une valeur dans une carte. Par exemple:

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

using namespace std;

int main()

{

    map <int, vector<int> > mymap;   

    mymap.insert(pair<int, vector<int> > (10, #put something here#));

    return 0;
}

Je ne sais pas quelle syntaxe utiliser pour insérer un vecteur de valeur. J'ai essayé {1,2}, mais cela a échoué. Quelle syntaxe dois-je utiliser?

Tout fonctionne si je déclare un vecteur à l'avance et que je lui donne un nom, mais je ne veux pas le faire, car je veux avoir une carte avec beaucoup de vecteurs.

Merci d'avance

16
Akavall

Fondamentalement, votre question ne concerne pas l'insertion de std::vector dans une std::map. Votre question est de savoir comment créer facilement un anonyme std::vector avec des valeurs initiales d'éléments arbitraires.

Dans ISO C++ 03, vous ne pouvez pas. C++ 11 permet cependant d'utiliser des listes d'initialisation , cependant.

Si vous êtes bloqué avec un compilateur C++ 03, vous pouvez éventuellement créer une fonction d'assistance pour renvoyer un vecteur avec les éléments spécifiés:

std::vector<int> make_vector(int a, int b)
{
    std::vector<int> v;
    v.Push_back(a);
    v.Push_back(b);
    return v;
}

Si les vecteurs que vous insérez sont de tailles différentes, vous pouvez utiliser une fonction variadique, bien que cela nécessiterait que vous transmettiez le nombre d'éléments ou que vous ayez une valeur sentinelle réservée.

9
jamesdlin

Si vous voulez un vecteur vide, vous pouvez le faire:

mymap.insert(pair<int,vector<int> >(10, vector<int>()));

Vous pouvez ensuite ajouter les éléments de votre choix avec quelque chose comme:

mymap[10].Push_back(1);
mymap[10].Push_back(2);

Edit: Suppression de l'affirmation incorrecte selon laquelle les vecteurs seraient copiés si/lorsque la carte se développait. Comme l'ont souligné les commentateurs, ce n'est pas vrai pour std :: map, qui est basé sur les nœuds.

17
Edward Loper

Si vous utilisez C++ 11, vous pouvez utiliser la liste d'initialisation du vecteur constructeur (le dernier constructeur de cette liste) qui ressemblerait à ceci:

mymap.insert(pair<int, vector<int> > (10, {1, 2, 3}));

Si vous ne pouvez utiliser que C++ 03, vector a un constructeur qui prend une taille et une valeur par défaut pour chaque élément qui pourraient vous suffire. Sinon, vous devrez construire le vecteur puis l'insérer. Si vous voulez éviter une copie superflue du vecteur lors de l'insertion, vous pouvez swap le faire comme ceci:

vector<int> myvec;
myvec.Push_back(1);
myvec.Push_back(2);
mymap[10].swap(myvec);

De cette façon, le vecteur n'aura pas besoin d'être copié. Vous obtiendrez une construction par défaut de vecteur supplémentaire, mais ce n'est pas très cher.

7
David Brown

#put something here# = vector<int>{1,2}

Je suis quand même surpris que {1,2} n'a pas fonctionné. N'utilisez-vous pas un compilateur C++ 11? Sinon, vous pouvez uniquement créer le vecteur avec le constructeur par défaut (pas de valeurs), ou le remplir d'abord avec des valeurs et le coller.

2
Edward Strange

Cela devrait fonctionner dans les compilateurs C++ 2003.

#include <iostream>
#include <vector>
#include <map>
#include <cassert>

using namespace std;

std::vector<int> make_vector(int a, int b) {
  std::vector<int> result;
  result.Push_back(a);
  result.Push_back(b);
  return result;
}

int main()

{

    map <int, vector<int> > mymap;

    mymap.insert(make_pair(10, make_vector(1,2)));
    // Or, alternatively:
    //   mymap[10] = make_vector(1,2);

    assert(mymap[10][0] == 1);
    assert(mymap[10][1] == 2);

    return 0;
}
1
Robᵩ

C++ 03 n'a pas de listes d'initialisation, ce qui peut être pénible pour initialiser des collections.

Si vous ne pouvez pas mettre à niveau vers une version plus moderne du compilateur, vous pouvez toujours utiliser le Boost.Assignment bibliothèque. Il a un list_of fonctionne précisément pour cela.

#put something here# -> boost::assign::list_of(1)(2)
1
Matthieu M.