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
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.
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.
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.
#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.
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;
}
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)