Accueil > Forum > > > > Pointeur de Vecteur
Pointeur de Vecteur
mardi 15 février 2011 à 00:34:32 |
Pointeur de Vecteur

lesgwenos
|
Bonjour à tous,
J'ai un petit problème, je ne sais pas initialiser un pointer de vector(de vector de pointer...).
Je travaille sur un code pour construire une sorte de recursivité semi-dynamique variable  , je n'ai pour l'instant pas trouvé de définition plus simple...
Dans la première étape de ma quête mysterieuse, voici ce que j'essaye de faire:
(c'est beaucoup plus simple)
je crée un vector de pointeurs vers des entiers.
Je le remplis avec 4 pointeurs vers quatres entiers.
Puis je souhaiterais simplement créer un autre vector qui contient un pointeur vers le vector crée auparavant...
J'ai entendu dire que c'est pas terrible de faire cela car lorsque l'on change le vector, la reference n'est plus valable, mais pour l'instant je souhaite garder une taille de vector fixe, avant d'explorer d'autre possibilités plus adaptées à mes besoins.
Tout se passe bien jusqu'à l'initialisation du 2ème vector. Et là se pose une multitude de questions... est-ce possible, faut-il allouer de la mémoire 'manuellement', en bref comment initialiser un pointeur de vecteur de pointeur (d'entiers)
Code C/C++ :
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char *argv[])
{
//Step 1
vector <int*> myVector2;
int* p1 = new int;
int* p2 = new int;
int* p3 = new int;
int* p4 = new int;
*p1 = 1;
*p2 = 5;
*p3 = 5;
*p4 = 26;
myVector2.push_back(p1);
myVector2.push_back(p2);
myVector2.push_back(p3);
myVector2.push_back(p4);
for (int i = 0; i < 4; i++)
{
cout << *myVector2[i] << "|";
}
cout << endl;
//Step 2
vector <vector<int*>*> myVector;
vector<int*>* p = new vector<int*>;
//*p=myVector2; // ?? Not possible
//p=&myVector2; // !! Only store the address
// ???????? how to initalise the pointer?????
myVector.push_back(p);
// Controls
cout << myVector2.size() << endl;
cout << myVector[0] << endl;
cout << &myVector2 << endl;
cout << p << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
C'est là ou y'a plein de points d'interrogation que je m'interroge...
J'espère que ma question est claire et qu'elle a un sens pour vous
Merci d'avance
(J'utilise Dev C++, environement Windows)
Gweno
|
|
mardi 15 février 2011 à 09:21:40 |
Re : Pointeur de Vecteur

buno
|
Yop!
Et pourquoi pas un vecteur de vecteur?
Code C/C++ :
@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
|
|
mardi 15 février 2011 à 10:11:18 |
Re : Pointeur de Vecteur

CptPingu
|
Réponse acceptée !
Évite les using namespace std, voir: [ Lien ]
Si tu cherches à faire des vector de vector, deux solutions:
- std::vector<std::vector<int> > évidemment, ou std::vector<std::vector<int>* > (mieux)
- Boost_multi_array
- std::vector<StaticArray<int, 4> >, qui est le plus simple à mettre en place, surtout si tu as une dimension fixe.
Avec StaticArray, une classe que tu crées qui encapsule un vecteur normal:
Code C/C++ :
#include <iostream>
#include <vector>
template <typename Type, int Size>
class StaticArray
{
public:
StaticArray()
{
}
~StaticArray()
{
}
Type operator[](int i) const
{
// To check: i >= 0 && i < Size
return _tab[i];
}
Type& operator[](int i)
{
// To check: i >= 0 && i < Size
return _tab[i];
}
private:
Type _tab[Size];
};
int main()
{
StaticArray<int, 5> tab1;
for (int i = 0; i < 5; ++i)
{
tab1[i] = i * 5;
std::cout << tab1[i] << std::endl;
}
std::vector<StaticArray<int, 5>*> vect;
vect.push_back(&tab1);
for (int i = 0; i < 5; ++i)
std::cout << (*vect[0])[i] << std::endl;
return 0;
}
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
jeudi 17 février 2011 à 00:52:22 |
Re : Pointeur de Vecteur

lesgwenos
|
Salut,
Yop!
Et pourquoi pas un vecteur de vecteur?
Code C/C++ :
vector<vector<int*>>
Merci Buno pour la suggestion, comme j'explique plus bas, je travaille sur une recursivite, et l'exemple de code en est le niveau 2, niveau 3 serait pointeur de pointeurs de pointeurs...
Évite les using namespace std, voir: sur http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
Si tu cherches à faire des vector de vector, deux solutions:
- std::vector<std::vector<int> > évidemment, ou std::vector<std::vector<int>* > (mieux)
- Boost_multi_array
- std::vector<StaticArray<int, 4> >, qui est le plus simple à mettre en place, surtout si tu as une dimension fixe.
Merci CptPingu,
Pour les namespace, Dev C++ le met par defaut et je suis un peu faineant, c'est pour ca que je programme
J'ai accepte ta reponse car elle va me permettre d'avancer.
En fait, il vaut peut-etre mieux que j'explique ce que je souhaite pouvoir coder:
J'ai choisi les vector car il me semble les plus adaptes, mais peut etre que les multi array en effet, ou les list seraient plus apropries.
pour illustrer:
Je souhaite avoir des structures imbriquees du genre:
(exemple)
<1,<2,3>,5,<0,<2,7,<4,5>,8>>>
ou
<<a,b,<a,c,<d,c>,a>>,e,<g,c>,i>
le fait que ce soient des int ou des char, des string ou meme des objets n'est pas la question.
La question est plus de l'ordre de la recursivite.
Pour la simplicite, je choisi les int
En terme de recursivite, alors:
ma structure recursive est la suivante:
element(n) est un element de la structure de niveau n.
element(0) est un entier
element(1) est une structure d'entiers
element(2) est une structure d'entiers OU/ET d'elements(1) OU/ET d'element 2
...
element(i) une structure d'entiers OU/ET d'elements(1) OU/ET d'element 2... OU/ET d'elements (i-1)
Vous m'arretez si je me gourre...
Les 2 seules facons sont:
-soit le metaprogramming pour creer une recursivite reelle (mais je n'y ai jamais mis les pieds... et je prefere eviter)
-soit avoir une etape de creation des differents niveaux d'elements avec sauvegarde des data; et une etape de lecture ou le niveau de recursivite sera connu par un chargement des data juste apres la compilation en utilisant des boucles a parametres.
L'idee en gros est que si l'on affiche une de ces structure, on puisse passer a un niveau de structure superieure si l'on a l'information necessaire pour 'zoomer' sur un des elements de la structure. Exemple:
struture d'integer:
<2,3,4,5> est affichee; je sait decomposer 5 en <2,3>... ma nouvelle structure sera alors:
<2,3,4,<2,3>>; ensuite si je sais que 2 est <1,1> j'aurai <2,3,4,<<1,1>,3>>; ... OK????
Je pense que pour arriver a mes fins, il faut desimbriquer les structures et utiliser des pointeurs, ainsi <2,3,4,<<1,1>,3>> deviendrait avec des pointeurs:
au depart:
*a=2
*b=3
*c=4
*d=5
structure1 est <a,b,c,d>
a la fin:
*a=2
*b=3
*c=4
(*d=5)
*e=1
*f=1
*g=3
*h pointe vers <e,f>
*i pointe vers <h,g>
structure1(new) est <a,b,c,g>
ceci n'est q'un exemple, les combinaisons sont inombrables
Donc ici je demande conseil aux experts, quelle serait le type de structure le plus adapte aux conditions citees plus haut.
J'espere ne pas trop en demander...
Gweno
|
|
jeudi 17 février 2011 à 10:00:56 |
Re : Pointeur de Vecteur

CptPingu
|
Attention, Dev-C++ n'est plus tenu à jour depuis des années ! Le compilateur livré avec est extrêmement vieux.
Pour du C++ sous Windows, je conseille généralement un IDE récent: Visual Studio, Code::Blocks ou QtCreator (qui en plus d'être multi plateforme, permet de faire des interfaces graphiques).
Avant de trouver une solution à ton problème, j'ai quelques questions:
1) Pourquoi cherches-tu à faire cela ?
En effet: <<a,b,<a,c,<d,c>,a>>,e,<g,c>,i> peut tout à fait s'écrire: <a, b, a, c, d, c, a, e, g, c, i>, non ?
De plus, je ne vois pas l'intérêt d'avoir ce genre de structure. Est-ce que tu n'essaierais pas de trouver une solution à un faux problème ?
2) Pourquoi parles-tu de récursivité ? Structure imbriquée != récursivité.
Pour répondre à ta question:
Les templates ne te conviendront que si tu as des donnés, au final, statiques. Si la structure de ta liste est connue par avance, oui les templates seront un choix élégant à ton problème. Effectivement, maîtriser les templates demande un niveau avancé.
En revanche, si tu la structure de ta liste est variable, ça ne te sera d'aucune utilité.
J'ai une solution technique à te proposer:
Tu fais une classe Array<T>, qui contient un std::vector<Array<T>*> et un std::vector<T>. Tu ajoutes une méthode hasSubList() qui dit si tu dois utiliser l'une ou l'autre liste. La première liste sera évidemment sous la forme: std::vector<Array<T>*>.
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
jeudi 17 février 2011 à 12:14:55 |
Re : Pointeur de Vecteur

CptPingu
|
Réponse acceptée !
J'ai un prototype à te proposer. Je n'ai pas la prétention de dire qu'il est parfait, mais il semble répondre à ton besoin.
Code C/C++ :
#include <iostream>
#include <vector>
#include <cassert>
template <typename T>
class Array
{
typedef typename std::vector<Array<T>*>::const_iterator iter;
public:
Array()
: _hasList(true)
{
}
Array(const Array<T>* array)
: _hasList(true)
{
_list.push_back(array);
}
Array(T value)
: _hasList(false), _value(value)
{
}
~Array()
{
for (iter it = _list.begin(); it != _list.end(); ++it)
delete *it;
}
bool hasList() const
{
return _hasList;
}
T getvalue(int i) const
{
assert(!_hasList);
return _value;
}
void setvalue(T value)
{
assert(!_hasList);
_value = value;
}
void add(Array<T>* list)
{
assert(_hasList);
_list.push_back(list);
}
void add(T value)
{
assert(_hasList);
_list.push_back(new Array<T>(value));
}
Array<T>* getList(int i) const
{
assert(!_hasList);
return _list[i];
}
void show(std::ostream& out) const
{
if (_hasList)
{
out << "<";
bool first = true;
for (iter it = _list.begin(); it != _list.end(); ++it)
{
if (!first)
out << ",";
else
first = false;
(*it)->show(out);
}
out << ">";
}
else
out << _value;
}
private:
const bool _hasList;
std::vector<Array<T>*> _list;
T _value;
};
int main()
{
// <1,<9,3>,5,<0,<2,7,<4,5>,8>>>
Array<int> list;
Array<int>* tab45 = new Array<int>;
tab45->add(4);
tab45->add(5);
Array<int>* tabRight = new Array<int>;
tabRight->add(2);
tabRight->add(7);
tabRight->add(tab45);
tabRight->add(8);
Array<int>* tab2Right = new Array<int>;
tab2Right->add(0);
tab2Right->add(tabRight);
Array<int>* tab93 = new Array<int>;
tab93->add(9);
tab93->add(3);
list.add(1);
list.add(tab93);
list.add(5);
list.add(tab2Right);
list.show(std::cout);
std::cout << std::endl;
return 0;
}
PS: Séparer proprement le code de sa définition.
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
mercredi 23 février 2011 à 00:27:15 |
Re : Pointeur de Vecteur

lesgwenos
|
Merci CptPingu,
Tout d'abord pour repondre a tes questions:
1) Pourquoi cherches-tu à faire cela ?
En effet: <<a,b,<a,c,<d,c>,a>>,e,<g,c>,i> peut tout à fait s'écrire: <a, b, a, c, d, c, a, e, g, c, i>, non ?
De plus, je ne vois pas l'intérêt d'avoir ce genre de structure. Est-ce que tu n'essaierais pas de trouver une solution à un faux problème ?
Je souhaite faire comme ca pour pouvoir separer plus facilement des donnees.
Je ne veux pas d'une structure plate car sinon il me faudrait travailler beaucoup sur les indices et creer des drapeaux de separations pour avoir mes sous ensembles. En ce qui concerne ce que je cherche a faire...
Une base de donnees a arborescence. Il s'agit de classer des informations simples. Par exemple: chaque element peut etre disseque en sous-elements si l'on possede l'information suffisante:
Exemple simple:
(Terre);
(Europe, Amerique du Nord, Autres Continents);
(Allemagne,Angleterre,France, Autres Pays d'Europe)(Etats-Unis,Mexique,Autres Pays d'Amerique du Nord);
(Bretagre, region Parisiennes, Autres Regions de France);
...
2) Pourquoi parles-tu de récursivité ? Structure imbriquée != récursivité.
Peut-etre que la notion de type recursif est plus adaptee. En effet chaque element peut etre un pointeur vers un element de type simple (string, pour l'exemple ci-dessus) ou un pointeur vers un ensemble de pointeurs d'elements.
Il y a certainement d'autres solutions pour ce genre de probleme, mais celle-ci me convient le mieux.
J'ai bien decortique ton prototype et je pense qu'il me convient parfaitement et me servira certainement de base de travail.
Je posterais mes travaux sur ce merveilleux site bien evidement.
Merci encore pour ton aide precieuse.
Gweno
|
|
mercredi 23 février 2011 à 01:06:07 |
Re : Pointeur de Vecteur

CptPingu
|
Réponse acceptée !
Dans ce cas l'utilisation d'un arbre général serait peut être adaptée :)
Au final, ce que je t'ai fait, y ressemble beaucoup.
Un cours ici (pas sûr que ce soit le meilleur lien):
http://www-ipst.u-strasbg.fr/pat/program/algo07.htm
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
Cette discussion est classée dans : int, vector, pointeur, push, myvector2
Répondre à ce message
Sujets en rapport avec ce message
je comprend plus rien(pointeur) [ par bidules ]
Bonjour,Pour moi on utilise les pointeur pour creer des tableau dynamiquement.or j'ai reussi a en declarer un avec une taille entrer a l'aide d'une va
Pointeur vers une fonction dans une classe ... [ par MoDDiB ]
Supposons que j'ai la fonctionvoid Fonction(int test,int t);appartenant a la classe Cclass.Quelle est la syntaxe pour creer un pointeur vers cette fon
POINTEUR aye aye aye [ par djkill55 ]
quelqun peut m expliquer pk ce programe ne marche pa svp...???le but c de remplir une matrice [3][3]a l aide des pointeur, la fct initializ est celle
pointeur de fonction [ par Larwin ]
salut tout le mondebon j'suis un gros débutant c/c++ et je fais mes premiers pas depuis 2, 3 jours...j'ai deja un petit probleme :)je m'explique :j'ai
Pointeur récalcitrant [ par asmanur ]
Bonjour, j'ai des prob avec des pointeurs regardez le codevoid LoadMap(int** Data,char* path){FILE* f=fopen(path,"r+");int Width=getc(f)-50;//Pourquoi
comment affecter un tableau à un pointeur d'une classe? [ par cesdejong ]
Bonjour,je débute un peu en C++ et je suis confronté à un problème pour lequel je ne trouve pas de solution élégante :class truc{...int* abscisse;int*
probleme SKD [ par Arnaud16022 ]
helloje suis sur VC6 et je voudrais charger des modeles md2 sous openGL. que faire? Évidemment un petit tour chez Digiben!! (bon je sais qu'il existe
pointeur sur une structure [ par xc78370 ]
Bonjour, Voila mon probleme. si quelqu'un a une idée, mrci d'avance.j'ai plusieurs structures, du style :---------------------------------------struct
Taille d'un pointeur ou d'un tableau ( très bizarre ) [ par thristam ]
Bonjour à tous,Quand je veux connaitre la taille d'un tableau , je fais :int i[10];coutPas de problème Par contre , si je fais la même chose avec un p
(__cdecl *) => kesako? [ par Oeil_de_taupe ]
Bonjour tout le monde, J'ai créé deux classes qui représentent un protocole pour envoyer des données entre deux PC. Lors de l'appele de leur construc
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|