|
|
|
|
Oulala j'en entends des vertes et des pas mûres ! Non un tableau n'est pas un pointeur.
int tab[5]; ...alloue 5 cases de taille int, à partir de l'adresse tab. On accède aux éléments avec l'opérateur [ ] : for(unsigned int i=0;i<5;++i){
std::cout<<tab[0]<<" ";
}
std::cout<<std::endl;
Pour les tableaux on PEUT passer par des pointeurs, notamment en C pour le cas d'un tableau dont la taille n'est pas connue à l'initialisation : unsigned int n=5; int *tab=(int *)malloc(n*sizeof(int)); L'utilisation est ensuite similaire (attention avec malloc les cases ne sont pas initialisées, contrairement à calloc). Cependant, en C++ on peut se passer de ces deux versions en ayant un tableau de taille dynamique et en s'affranchissant des pointeurs, à l'aide de la STL (standrad template librairie). C'est ce qui est communément utilisé. La STL propose un certain nombre de conteners (vecteurs, ensembles triés...) et génériques (grâce aux template). Le choix du contener est important selon ce qu'on veut faire. Exemple : - Ensemble non trié d'élément éventuellement distinct, accès direct à un élément (O(1)) -> utiliser la classe vector - Ensemble trié d'éléments 2 à 2 distincts , par défaut triés par ordre croissant -> utiliser la classe set. Il faut bien voir qu'on peut mettre aussi bien des int que des char ou des float (toujours grâces au template). De plus un certains nombre de méthodes sont déjà implémentées de base (taille du tableau, insertion d'un élément, recherche d'un élément...). On peut voir les bases par exemple ici : http://www-inf.int-evry.fr/cours/C++/CoursEA/node39.html Concrètement dans ton cas ça donne un truc du genre
//Si tu veux le faire avec des sets change tous les "vector" par des "set"
#include <vector>
#include <iostream>
int main(){
std::vector<int> tab;
tab.push_back(3);//pour un set c'est la méthode insert
tab.push_back(5);
tab.push_back(2);
tab.push_back(2);
tab.push_back(4);
//Le tableau contient 3,5,2,2,4
//Méthode 1 (moche) uniquement pour les vectors
int max=tab[0];
for(unsigned int i=0;i<tab.size();++i){
if(tab[i]>max) max=tab[i];
}
//Méthode 2 (mieux, mais seulement si tab n'est pas const)
//Pour les sets tu ne peux pas utiliser la méthode 1
for(vector<int>::iterator it=tab.begin();it!=tab.end();++it){
if(*it>max) max=*it;
}
std::cout<<"Le max vaut : "<<max<<std::endl;
return 0;
}
Bonne chance |
Bonjour tout le monde,
int tab[5];tab contient l'adresse de la première case du tableau. Si tu fais tab++;tu n'incrémentes pas un entier mais tu pointeras sur la 2è case du tableau ('fin je crois...). ++ Le Parisien, il vaut mieux l'avoir en journal !!! :-P |
*tab=tab[0] correspond à la première valeur.
|
Répondre à mamiemando
|
Non pas tab::at(i) mais tab.at(i) (avec tab un vector, et je crois que ça marche aussi avec les set). L'opérateur a::b désigne "chercher une fonction b dans un namespace a". Exemple
namespace a{
int f(){ return 0; }
}
Tu peux imbriquer les namespace. C'est assez pratique quand tu as un énorme projet pour éviter d'avoir deux fois le même nom de fonction, ça permet d'organiser quoi ;-) Quand vous aurez fini avec la stl, les plus motivés pourront enchaîner avec boost (permet de gérer des matrices énormes et plein d'autres trucs) et la bgl (pour ceux qui font des graphes). Attention par contre c'est chaud et vous avez intérêt à maitriser les template avent de vous y lancer ;-) Bonne chance |
Dig up!!
|
Non ce n'est pas la même vocation. Boost permet de manipuler entre autres des graphes (BGL) mais pas seulement. Il est par exemple possible de serializer des structure (ie générer un fichier binaire qui va permettre lors d'une exécution ultérieure de la charger immédiatement en mémoire).
|