OVH Cloud OVH Cloud

[debutant] vector

15 réponses
Avatar
Bruno CAUSSE
Apres avoir lu les contributions de la liste je "passe" aux vectors :-)

J'ai une,

class A {

int a;
int b;
Int c;

A(): a(0), b(0), c(0) {}
};

class B {

/* pointeur pour pouvoir intervertir premier et deuxieme rapidement c.a.d.
Sans recopie d'objet; */

A* premier;
A* deuxieme;

B() : premier(NULL), deuxieme(NULL) {

Try {
Premier = new A();
Deuxieme = new A();
} catch (std::bad_alloc& e_bd) {
delete A;
throw;
}
}

~B() {
delete A;
delete B;
}

};

class C {

std::vector<B> table;

C(int n_elts) {
/* initialise la taille du vecteur et INITIALISE CHAQUE ELT par appel au
constructeur B(); */
table.resize(n_elts);
}

}

Est ce correcte?

Si la creation d'un objet C echoue (capacité trop grande) que se passe t'il?
Comment en etre informé, les objets B alloués sont t'ils detruits?

Peut on fixer ("const") la taille d'un vecteur. Aucun retrait ou ajout?

Merci
--
bruno

10 réponses

1 2
Avatar
Jean-Marc Bourguet
Bruno CAUSSE writes:

Est ce correcte?


Non. Que font l'assignement et le constructeur de copie (pourquoi pas
mal de gens mettent toujours un re- devant?) de B?

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Bruno CAUSSE
dans l'article , Jean-Marc Bourguet à
a écrit le 12/08/05 11:26 :

Bruno CAUSSE writes:

Est ce correcte?


Non. Que font l'assignement et le constructeur de copie (pourquoi pas
mal de gens mettent toujours un re- devant?) de B?


Oui, oui... Disons

B(const B& src) {

//cas particulier que des membres primitifs (int)
*premier = *(src.premier);
*deuxieme = *(src.deuxieme);
};

B& operator(B& src)= {

if(*this != src) {
*premier = *(src.premier);
*deuxieme = *(src.deuxieme);
}

return *this;
};


Avatar
Arnaud Meurgues
Bruno CAUSSE wrote:
class B {

/* pointeur pour pouvoir intervertir premier et deuxieme rapidement c.a.d.
Sans recopie d'objet; */

A* premier;
A* deuxieme;

B() : premier(NULL), deuxieme(NULL) {

Try {
Premier = new A();
premier

Deuxieme = new A();
deuxieme

} catch (std::bad_alloc& e_bd) {
delete A;
delete premier; // A est un type, pas une variable

throw;
}
}

~B() {
delete A;
delete premier; // idem

delete B;
delete deuxieme; // idem

}

};

Peut on fixer ("const") la taille d'un vecteur. Aucun retrait ou ajout?


boost::array est, je crois, fait pour ça (tableaux à taille fixe).

--
Arnaud

Avatar
Bruno CAUSSE
dans l'article 42fc6f05$0$23695$, Arnaud Meurgues à
a écrit le 12/08/05 11:44 :

Bruno CAUSSE wrote:
class B {

/* pointeur pour pouvoir intervertir premier et deuxieme rapidement c.a.d.
Sans recopie d'objet; */

A* premier;
A* deuxieme;

B() : premier(NULL), deuxieme(NULL) {

Try {
Premier = new A();
premier

Deuxieme = new A();
deuxieme

} catch (std::bad_alloc& e_bd) {
delete A;
delete premier; // A est un type, pas une variable

throw;
}
}

~B() {
delete A;
delete premier; // idem

delete B;
delete deuxieme; // idem

}

};



Oui des etourderies de frappe (pas sur la tete).

Peut on fixer ("const") la taille d'un vecteur. Aucun retrait ou ajout?


boost::array est, je crois, fait pour ça (tableaux à taille fixe).


Pour boost (*incontournable* il me semble) on verra plus tard :-)


Avatar
Jean-Marc Bourguet
Bruno CAUSSE writes:

dans l'article , Jean-Marc Bourguet à
a écrit le 12/08/05 11:26 :

Bruno CAUSSE writes:

Est ce correcte?


Non. Que font l'assignement et le constructeur de copie (pourquoi pas
mal de gens mettent toujours un re- devant?) de B?


Oui, oui... Disons

B(const B& src) {

//cas particulier que des membres primitifs (int)
*premier = *(src.premier);
*deuxieme = *(src.deuxieme);
};

B& operator(B& src)= {

if(*this != src) {
*premier = *(src.premier);
*deuxieme = *(src.deuxieme);
}

return *this;
};


Es-tu sur? As-tu essaye? Qu'est-ce qui se passe?

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Bruno CAUSSE
dans l'article , Jean-Marc Bourguet à
a écrit le 12/08/05 11:47 :

Es-tu sur? As-tu essaye? Qu'est-ce qui se passe?


Malheureusement, je ne fais que de la "théorie" la journée, ma machine avec
les outils de dev n'est accessible que le soir :-)

Avatar
Fabien LE LEZ
On Fri, 12 Aug 2005 11:15:50 +0200, Bruno CAUSSE :

En passant, si cette adresse n'est pas correcte, merci de rajouter
".invalid" à la fin.

/* pointeur pour pouvoir intervertir premier et deuxieme rapidement c.a.d.
Sans recopie d'objet; */

A* premier;
A* deuxieme;


C'est un peu une bombe nucléaire pour tuer une mouche.
Tu fais là de l'optimisation précoce : tu compliques le code dans
l'espoir que ton programme aille plus vite, mais sans savoir à
l'avance s'il y a réellement un problème de vitesse.
Si ça se trouve, tes bidouillages ralentiront le programme.

Donc, ton code me paraît incorrect pour deux raisons :

- comme il y a des pointeurs et de l'allocation dynamique, tu dois
rajouter un construteur de copie et un opérateur de copie -- en
l'état, ça plantera à la première copie.

- ton code est inutilement compliqué, et je considère ça comme une
erreur de programmation.

Peut on fixer ("const") la taille d'un vecteur. Aucun retrait ou ajout?


J'ai du mal à comprendre ta terminologie. Parles-tu ici d'un tableau
(std::vector<>), ou d'un vecteur, i.e. objet mathématique, élément
d'un espace vectoriel, représenté généralement par un tableau de
taille fixe ?

Si tu veux un tableau de taille fixe connue à la compilation, un
tableau "à la C" convient :
static size_t const taille_tableau= 42;
int tableau [taille_tableau];

Si tu veux un tableau de taille fixée dans le constructeur, ce n'est
pas très difficile à programmer :

template <class T> class TableauTailleFixe
{
public:
typedef std::vector<T> Data;
typedef Data::iterator iterator;
typedef Data::const_iterator const_iterator;

TableauTailleFixe (size_t taille, T const& t= T())
: data (taille, t) {}

T& operator[] (size_t n) { return data.at(n); }
T const& operator[] (size_t n) const { return data.at(n); }

const_iterator begin() const { return data.begin(); }
const_iterator end() const { return data.end(); }
iterator begin() { return data.begin(); }
iterator end() { return data.end(); }

private:
Data data;
};

Note : il manque quelques trucs, comme les reverse_iterator, mais tu
peux les rajouter au fur et à mesure de tes besoins.

Avatar
Jean-Marc Bourguet
Bruno CAUSSE writes:

dans l'article , Jean-Marc Bourguet à
a écrit le 12/08/05 11:47 :

Es-tu sur? As-tu essaye? Qu'est-ce qui se passe?


Malheureusement, je ne fais que de la "théorie" la journée, ma machine avec
les outils de dev n'est accessible que le soir :-)


1/ quel est la difference entre
*this != src
et
this != &src

2/ Pourquoi est-ce que le test
*this != src
est necessaire? (En premiere approximation, si un tel test est
necessaire, il y a grande chance que le code soit incorrect en
presence d'exceptions)

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Fabien LE LEZ
On Fri, 12 Aug 2005 11:42:54 +0200, Bruno CAUSSE :

if(*this != src) {
*premier = *(src.premier);
*deuxieme = *(src.deuxieme);
}


Je te conseille de lire Exceptional C++ (Herb Sutter), dont une partie
importante est consacrée à cette construction et tout ce qui va
autour.

Avatar
Fabien LE LEZ
On 12 Aug 2005 11:53:46 +0200, Jean-Marc Bourguet :

2/ Pourquoi est-ce que le test
*this != src
est necessaire? (En premiere approximation, si un tel test est
necessaire, il y a grande chance que le code soit incorrect en
presence d'exceptions)


Et en deuxième approximation, étant donné un code contenant ce test,
il y a toujours un moyen plus élégant, ne contenant pas le test en
question...

1 2