Forum debian-fr.org

Rechercher:

* Connexion   * M’enregistrer

* FAQ    * Rechercher





Poster un nouveau sujet Répondre au sujet  [ 16 messages ] 
Auteur Message
 Sujet du message: C++ , les template vs vector
MessagePosté: 06 Mai 2012 12:16 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 09 Jan 2007 22:49
Messages: 3596
Hello

J'essaye de me bricoler, du moins pour le début quelque chose de fonctionnelle hum .
en bref :

le but est que l'utilisateur puisse dans le main avoir une méthode simple
Code:
maclasse objtableau;
objtableau(0,1,"string"); //tableau a plusieur dimention 0 = tableaux contenant d'autre tableaux, 1 index du tableaux, valeur


j'ai donc fait une classe template (le terme est juste?)
fichier cTableaux.tpp
Code:
#ifndef DEF_TEMPLATE_TABLEAU
#define DEF_TEMPLATE_TABLEAU
#include <iostream>
#include <vector>

template <typename T1> class Tableaux
{
public:
    //Paire();

    void affiche(T1 v);
    void setData(T1 v,T1 v2,std::string Dt);
    //{ std::cout << "Dépassement d'indice sur un tableau : " << "\n"; }
private :
    std::vector<T1> NV1;//ok
    std::vector < std::vector < T1 > > NV2;
};
template <class T1>
void Tableaux<T1>::affiche (T1 v)
{
   std::cout << "Info: " << v <<  "\n";
}

template <class T1>
void Tableaux<T1>::setData (T1 v,T1 v2,std::string Dt)
{
    NV2.push_back(NV1);
    NV2.push_back(NV1);
   NV2[v].push_back("dt"); //problème v ne doit pas être de type std::string, mai dt si , comment faire ??
    std::cout << "Info: " << v << Dt <<  "\n";
}
#endif


main
Code:
#include <iostream>
//#include "cTableaux.hpp"
#include "cTableaux.tpp"
using namespace std;
//typedef Pile<int> PileInt;

int main()
{
int  V=1;
int V2=1;
std::string Str="me";
Tableaux<std::string> B;
B.affiche(Str);
B.setData(Str,Str,Str);// évidament sa coince
return 0;
}

évidement avec les int sa passe sans problème (mettre en commentaire la ligne NV2[v].push_back("dt");)
Code:
int V=1;
int V2=1;
std::string Str="me";
Tableaux<int> B;
B.affiche(V);
B.setData(V,V2,Str);



Je débute avec les templates donc un petit exemple avec la syntax est un plus :-?

Merci d'avance

_________________
pq5 se plus proc 3.4 ghz 8 go de ram
ssd 1 dd 90 go ext4
nvidia 460
debian 64 bits wheezy beta 1
Enjoy ;)


Haut
 Profil  
 
MessagePosté: 07 Mai 2012 16:16 
Hors ligne
Modérateur du forum
Avatar de l’utilisateur

Inscription: 18 Mai 2009 16:49
Messages: 4040
Le problème que tu as n'a rien à voir avec les templates. Donc avant de faire un template il faut savoir ce que tu veux faire précisément.

std::vector<int> : un tableau contenant des entiers (et dont les index sont forcément des size_t çàd des entiers, y'a pas le choix c'est comme ça que fonctionne std::vector)
std::vector<std::string> : un tableau contenant des chaînes (même remarque pour les index)
std::vector< std::vector<std::string> > : un tableau contenant des tableaux de chaînes (autrement dit, un tableau à deux dimensions contenant des chaînes, les index restent toujours des entiers)

Qu'est-ce que tu veux faire exactement ? Si c'est, comme j'en ai l'impression, pouvoir utiliser des "index" du type que tu as choisi, std::vector n'est pas le bon choix il te faudrait plutôt une hashtable (conteneurs associatifs de type std::map, voire std::unordered_map si tu utilises du C++11 ou le TR1 C++0x).

_________________
testing/unstable (amd64) sous KDE4
github/syam44 - De la bonne manière de poser les questions - Wiki debian-fr
Just because you're paranoid doesn't mean they aren't after you. -- J.Heller


Haut
 Profil  
 
MessagePosté: 07 Mai 2012 17:05 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 18 Juil 2007 17:57
Messages: 7735
Localisation: Grenoble
syam a écrit:
Qu'est-ce que tu veux faire exactement ? Si c'est, comme j'en ai l'impression, pouvoir utiliser des "index" du type que tu as choisi, std::vector n'est pas le bon choix il te faudrait plutôt une hashtable (conteneurs associatifs de type std::map, voire std::unordered_map si tu utilises du C++11 ou le TR1 C++0x).

J'ai pas compris ton explication, tu parle d'utiliser une map pour pouvoir utiliser un int comme clef ?

@panthere > Je ne comprends pas trop ta classe. Le paramètre de généricité concerne le type contenu pas le type des indices :
Code:
#ifndef DEF_TEMPLATE_TABLEAU
#define DEF_TEMPLATE_TABLEAU
#include <iostream>
#include <vector>

template <typename T1> class Tableaux
{
public:
    //Paire();

    void affiche(size_t v);
    void setData(size_t v,size_t v2, T1 Dt);
    //{ std::cout << "Dépassement d'indice sur un tableau : " << "\n"; }
private :
    // std::vector<T1> NV1;//ok // À quoi ça sert ?
    std::vector < std::vector < T1 > > NV2;
};
template <class T1>
void Tableaux<T1>::affiche (size_t v)
{
   std::cout << "Info: " << v <<  "\n";
}

template <class T1>
void Tableaux<T1>::setData (size_t v, size_t v2, T1 Dt)
{
    NV2.at(v).at(v1) = Dt;
    // Je crois que ça marche aussi bien avec at et autant utiliser at si tu veut renvoyer une erreur en cas de dépassement de tableau

    std::cout << "Info: " << v << Dt <<  "\n";
}
#endif


D'un point de vu API, j'aime beaucoup ce que propose eigen, qui remplace ça :
Code:
maclasse objtableau;
objtableau.setData(0,1,"string"); //tableau a plusieur dimention 0 = tableaux contenant d'autre tableaux, 1 index du tableaux, valeur

Par ça :
Code:
maclasse objtableau;
objtableau(0,1) = "string"; //tableau a plusieur dimention 0 = tableaux contenant d'autre tableaux, 1 index du tableaux, valeur


Je trouve que c'est élégant. Pour le faire il faut regarder du coté des functors (redéfinition de opérateur () ).

_________________
Je suis Pitta, cartésien, irritable, irritant et névrosé (de plus je fais de l'entrisme pour zsh), si l'un de mes messages vous insupporte essayez d'y voir de l'ironie ou de ne pas en tenir compte. Bonne journée et gardez le sourire. :)


Haut
 Profil  
 
MessagePosté: 07 Mai 2012 17:21 
Hors ligne
Modérateur du forum
Avatar de l’utilisateur

Inscription: 18 Mai 2009 16:49
Messages: 4040
MisterFreez a écrit:
syam a écrit:
Qu'est-ce que tu veux faire exactement ? Si c'est, comme j'en ai l'impression, pouvoir utiliser des "index" du type que tu as choisi, std::vector n'est pas le bon choix il te faudrait plutôt une hashtable (conteneurs associatifs de type std::map, voire std::unordered_map si tu utilises du C++11 ou le TR1 C++0x).

J'ai pas compris ton explication, tu parle d'utiliser une map pour pouvoir utiliser un int comme clef ?

@panthere > Je ne comprends pas trop ta classe.

Non justement, j'ai bien l'impression qu'il veut pouvoir utiliser des string comme index (ou autres, en fait un typename paramétré par le template), cf. son premier exemple d'utilisation avec B.setData(Str,Str,Str);
Cela dit moi non plus je ne comprends pas trop ni sa classe ni ses explications. D'où le fait que je demande avant tout des précisions même si je me hasarde à deviner son intention avec std::map. ;)

_________________
testing/unstable (amd64) sous KDE4
github/syam44 - De la bonne manière de poser les questions - Wiki debian-fr
Just because you're paranoid doesn't mean they aren't after you. -- J.Heller


Haut
 Profil  
 
MessagePosté: 08 Mai 2012 20:27 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 09 Jan 2007 22:49
Messages: 3596
Merci pour vos réponse,
désoler pour la réponse tardive mai un peux crever a cause du boulôt. :015

En fait je cherche a en faire un conteneur, pas vraiment avec une clef. car std::map serai alors la solution.
le souci est le nombre de tableaux autrement dit une matrice, oui mai non c'est pas une matrice... :017

le but est qu'on puisse rechercher dans le contenu d'un tableau, quelque soit son type de contenu.
je résume:

1.- Un tableaux qui contien X tableau ,ceci permet donc d'avoir plusieur dimention a shouait 1 a N.
2.- le type de donnée peut être n'importe quoi. d'ou l'interet des templates.
3.- instance via un classe c'est quand meme plus pratique:)

Le problème
c'est que le(s) tableau(s) de type vector doive être du même type , écrire une fonction/methode pour chaque type c'est possible mai les template son en principe souvent citer comme solution.

comme on utilise pas une clef, on utilise donc une boucle ,de type int,long,double etc pour rechercher,lister simplement les élément.

dans le main.cpp sa donnerai en très gros,

Code:
cMeTab  ObjTab(Nombre_de_tableau,type_de_donnée);
ObjTab.insert(tableaux_4,type_char);


Merci de m'avoir lu

_________________
pq5 se plus proc 3.4 ghz 8 go de ram
ssd 1 dd 90 go ext4
nvidia 460
debian 64 bits wheezy beta 1
Enjoy ;)


Haut
 Profil  
 
MessagePosté: 09 Mai 2012 18:15 
Hors ligne
Modérateur du forum
Avatar de l’utilisateur

Inscription: 18 Mai 2009 16:49
Messages: 4040
Ok bon j'avais compris de travers. Mais c'est toujours pas clair...

panthere a écrit:
1.- Un tableaux qui contien X tableau ,ceci permet donc d'avoir plusieur dimention a shouait 1 a N.

Tu veux un tableau multidimensionnel (nombre arbitraire de dimensions) et si oui tu veux pouvoir choisir le nombre de dimensions uniquement à la compilation ou bien aussi à l'exécution ?
Ou bien tu veux juste un tableau bidimensionnel, auquel cas ton utilisation du mot "dimension" n'est pas correct dans ta phrase ?

_________________
testing/unstable (amd64) sous KDE4
github/syam44 - De la bonne manière de poser les questions - Wiki debian-fr
Just because you're paranoid doesn't mean they aren't after you. -- J.Heller


Haut
 Profil  
 
MessagePosté: 09 Mai 2012 23:51 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 09 Jan 2007 22:49
Messages: 3596
syam a écrit:
Ok bon j'avais compris de travers. Mais c'est toujours pas clair...

panthere a écrit:
1.- Un tableaux qui contien X tableau ,ceci permet donc d'avoir plusieur dimention a shouait 1 a N.

Tu veux un tableau multidimensionnel (nombre arbitraire de dimensions) et si oui tu veux pouvoir choisir le nombre de dimensions uniquement à la compilation ou bien aussi à l'exécution ?
Ou bien tu veux juste un tableau bidimensionnel, auquel cas ton utilisation du mot "dimension" n'est pas correct dans ta phrase ?



1.- Oui pour :(nombre arbitraire de dimensions
2.-le tableaux est dynamique, on ne connais pas sa taille, c'est dire le nombre d'élément a contenir, sa concerne donc je pense l'exécution principalement. :?:

c'est pas le fait de comprendre qui est dure, c'est plutôt d'être claire dans ce qu'on veux expliquer ,alors forcement l'idée est la mai pour l'écrire :doh: :grin:

_________________
pq5 se plus proc 3.4 ghz 8 go de ram
ssd 1 dd 90 go ext4
nvidia 460
debian 64 bits wheezy beta 1
Enjoy ;)


Haut
 Profil  
 
MessagePosté: 10 Mai 2012 00:26 
Hors ligne
Modérateur du forum
Avatar de l’utilisateur

Inscription: 18 Mai 2009 16:49
Messages: 4040
panthere a écrit:
1.- Oui pour :(nombre arbitraire de dimensions
2.-le tableaux est dynamique, on ne connais pas sa taille, c'est dire le nombre d'élément a contenir, sa concerne donc je pense l'exécution principalement. :?:

La taille n'a rien à voir avec le nombre de dimensions, je partais bien du principe que la taille est variable à l'exécution. La question était est-ce que le nombre de dimensions (à ne pas confondre avec "les dimensions") est connu à la compilation ou uniquement à l'exécution ? La différence entre les deux, c'est que le nombre de dimensions détermine le type si tu veux imbriquer des std::vector les uns dans les autres, donc c'est beaucoup plus compliqué de changer ce nombre de dimensions à l'exécution.

Et un petit dessin pour aller avec, histoire d'être certain qu'on parle bien de la même chose :
Image

_________________
testing/unstable (amd64) sous KDE4
github/syam44 - De la bonne manière de poser les questions - Wiki debian-fr
Just because you're paranoid doesn't mean they aren't after you. -- J.Heller


Haut
 Profil  
 
MessagePosté: 12 Mai 2012 00:02 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 09 Jan 2007 22:49
Messages: 3596
syam a écrit:
panthere a écrit:
1.- Oui pour :(nombre arbitraire de dimensions
2.-le tableaux est dynamique, on ne connais pas sa taille, c'est dire le nombre d'élément a contenir, sa concerne donc je pense l'exécution principalement. :?:

La taille n'a rien à voir avec le nombre de dimensions, je partais bien du principe que la taille est variable à l'exécution. La question était est-ce que le nombre de dimensions (à ne pas confondre avec "les dimensions") est connu à la compilation ou uniquement à l'exécution ? La différence entre les deux, c'est que le nombre de dimensions détermine le type si tu veux imbriquer des std::vector les uns dans les autres, donc c'est beaucoup plus compliqué de changer ce nombre de dimensions à l'exécution.

Et un petit dessin pour aller avec, histoire d'être certain qu'on parle bien de la même chose :
Image



On parle bien de la même chose, on parle bien de la 3eme image 3x4x2 .
Le bute des vector c est bien être redimentinonable, et pas a taille fixe. donc si a l'exécution sa passe a 4x4x2
sa ne devrai pas déranger sinon un simple tableau[] suffirait :)

_________________
pq5 se plus proc 3.4 ghz 8 go de ram
ssd 1 dd 90 go ext4
nvidia 460
debian 64 bits wheezy beta 1
Enjoy ;)


Haut
 Profil  
 
MessagePosté: 12 Mai 2012 00:39 
Hors ligne
Modérateur du forum
Avatar de l’utilisateur

Inscription: 18 Mai 2009 16:49
Messages: 4040
Désolé d'être chiant, mais tu n'as toujours pas répondu clairement à la question : est-ce que le nombre de dimensions est fixe et/ou connu à la compilation, ou bien est-ce qu'il varie à l'exécution ?
Si j'insiste autant là-dessus c'est parce que le premier cas est relativement "simple" à traiter, le deuxième l'est beaucoup moins !

_________________
testing/unstable (amd64) sous KDE4
github/syam44 - De la bonne manière de poser les questions - Wiki debian-fr
Just because you're paranoid doesn't mean they aren't after you. -- J.Heller


Haut
 Profil  
 
MessagePosté: 12 Mai 2012 20:41 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 09 Jan 2007 22:49
Messages: 3596
syam a écrit:
Désolé d'être chiant, mais tu n'as toujours pas répondu clairement à la question : est-ce que le nombre de dimensions est fixe et/ou connu à la compilation, ou bien est-ce qu'il varie à l'exécution ?
Si j'insiste autant là-dessus c'est parce que le premier cas est relativement "simple" à traiter, le deuxième l'est beaucoup moins !

il varie a l'exécution

_________________
pq5 se plus proc 3.4 ghz 8 go de ram
ssd 1 dd 90 go ext4
nvidia 460
debian 64 bits wheezy beta 1
Enjoy ;)


Haut
 Profil  
 
MessagePosté: 16 Mai 2012 01:28 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 09 Jan 2007 22:49
Messages: 3596
aurait-je oublier quelque chose :-? :?: :think:

_________________
pq5 se plus proc 3.4 ghz 8 go de ram
ssd 1 dd 90 go ext4
nvidia 460
debian 64 bits wheezy beta 1
Enjoy ;)


Haut
 Profil  
 
MessagePosté: 16 Mai 2012 02:00 
Hors ligne
Modérateur du forum
Avatar de l’utilisateur

Inscription: 18 Mai 2009 16:49
Messages: 4040
Non c'est juste que pour le moment j'ai pas trouvé de solution "évidente" pour faire varier le nombre de dimensions à l'exécution, et je n'ai pas pris le temps de chercher sur internet s'il existe une solution toute faite.
Le problème c'est que pour faire varier le nombre de dimensions, soit il faut changer le type du conteneur en fonction du nombre de dimensions (ce qui est impossible à faire à l'exécution vu que le C++ est typé statiquement), soit il faut bricoler avec des pointeurs et des casts dans tous les sens... :-?

_________________
testing/unstable (amd64) sous KDE4
github/syam44 - De la bonne manière de poser les questions - Wiki debian-fr
Just because you're paranoid doesn't mean they aren't after you. -- J.Heller


Haut
 Profil  
 
MessagePosté: 16 Mai 2012 09:07 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 09 Jan 2007 22:49
Messages: 3596
syam a écrit:
Non c'est juste que pour le moment j'ai pas trouvé de solution "évidente" pour faire varier le nombre de dimensions à l'exécution, et je n'ai pas pris le temps de chercher sur internet s'il existe une solution toute faite.
Le problème c'est que pour faire varier le nombre de dimensions, soit il faut changer le type du conteneur en fonction du nombre de dimensions (ce qui est impossible à faire à l'exécution vu que le C++ est typé statiquement), soit il faut bricoler avec des pointeurs et des casts dans tous les sens... :-?

oki , de toute façons pas de souci ce n'est pas urgent (oui bon avant la fin de l'année quand même :lol: )

_________________
pq5 se plus proc 3.4 ghz 8 go de ram
ssd 1 dd 90 go ext4
nvidia 460
debian 64 bits wheezy beta 1
Enjoy ;)


Haut
 Profil  
 
MessagePosté: 23 Mai 2012 19:13 
Hors ligne
Grand posteur
Avatar de l’utilisateur

Inscription: 04 Avr 2007 23:04
Messages: 158
Localisation: Toulouse
syam a écrit:
Non c'est juste que pour le moment j'ai pas trouvé de solution "évidente" pour faire varier le nombre de dimensions à l'exécution, et je n'ai pas pris le temps de chercher sur internet s'il existe une solution toute faite.
Le problème c'est que pour faire varier le nombre de dimensions, soit il faut changer le type du conteneur en fonction du nombre de dimensions (ce qui est impossible à faire à l'exécution vu que le C++ est typé statiquement), soit il faut bricoler avec des pointeurs et des casts dans tous les sens... :-?


Il y a bien une solution, de tout stocker dans un seul vecteur de dimension 1, mais plus grand (on concatène tout quoi)...

Par exemple, un vecteur avec 2 dimensions respectivement m, n.
On crée un std::vector de taille m*n
L'accès à la vleur [i][j] se fera en accédant à la valeur [j*m + i] du std::vector

3 dimensions m, n, o ?
pour accéder à [i][j][k] on cherchera [k*m*n + j*m + i] (si je ne me plante pas)

etc.

Une fonction qui connaît le vecteur de dimensions [m, n, o, ...] (de taille variable à l'éxécution) à qui on passe un vecteur d'indexs [i, j, k, ...] (de même taille) devrait pouvoir te calculer l'index composite via une boucle sans problème, et ce quelque soit le nombre de dimensions... faut juste écrire l'algo :smile:

edit: Je sais pas si je réponds vraiment à la question initiale (que je ne comprends pas :eusa-think:) , je me suis attaché à la question : "un vecteur avec un nombre de dimensions variant à l'exécution".


Haut
 Profil  
 
MessagePosté: 30 Mai 2012 17:47 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 09 Jan 2007 22:49
Messages: 3596
intéressant l'idée, inconvenant c'est l'algo je doute que sa soie la solution car c est le cpu qui va bosser.
Bon finalement je laisse tomber plus le temps de chercher.
Merci encore pour vos réponse :023

_________________
pq5 se plus proc 3.4 ghz 8 go de ram
ssd 1 dd 90 go ext4
nvidia 460
debian 64 bits wheezy beta 1
Enjoy ;)


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 16 messages ] 

Index du forum » Divers » Programmation


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Aller à:  
Flux RSS Flux RSS Liste des flux Liste des flux
Powered by phpBB® Forum Software © phpBB Group
Traduction par: phpBB-fr.com
SEO
[ Time : 0.107s | 14 Queries | GZIP : Off ]