Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Bertrand Motuelle
Nicolas Aunai wrote:
concernant les iterator j'ai compris l'intérêt je pense, cependant j'ai une erreur lors de la compilation que je ne comprends pas du tout :
class C_Tab { public: vector <int> tableau; int somme(vector <int> tab); C_Tab(); };
int C_Des::compte(int n) const { int compteur=0; vector<int>::iterator i= combi.tableau.begin(); while(i!=combi.tableau.end()) { if(*i==n) compteur++; i++; } return compteur; }
combi est un C_Tab.
et j'ai cette erreur : C:/Dev-Cpp/include/c++/bits/stl_iterator.h: In constructor `__gnu_cxx::__normal_iterator<_Iterator, _Container>::__normal_iterator(const __gnu_cxx::__normal_iterator<_Iter, _Container>&) [with _Iter = const int*, _Iterator = int*, _Container > std::vector<int, std::allocator<int> >]':
D:/...yathzee1.cpp:93: instantiated from here
C:/...: invalid conversion from `const int* const' to `int*'
sur la ligne d'initialisation de l'itérateur...
Dans ta fonction compte() qui est const, la variable membre combi est egalement const (rappelle-toi les reponses sur le type de this dans une fonction membre const).
De meme, comme combi est const, sa variable membre tableau est const.
Il y a deux fonctions begin() dans std::vector (et toutes les autres collections): - iterator begin(); - const_iterator begin() const; (idem pour end())
le type vector<int>::iterator a la meme semantique que le type int*. le type vector<int>::const_iterator a la meme semantique que le type const int*.
tableau etant const, c'est la deuxieme fonction membre begin qui est choisie par le compilateur.
Or tu as ecrit:
vector<int>::iterator i= combi.tableau.begin();
...
Bertrand.
Nicolas Aunai wrote:
concernant les iterator j'ai compris l'intérêt je pense, cependant j'ai
une erreur lors de la compilation que je ne comprends pas du tout :
class C_Tab
{
public:
vector <int> tableau;
int somme(vector <int> tab);
C_Tab();
};
int C_Des::compte(int n) const
{
int compteur=0;
vector<int>::iterator i= combi.tableau.begin();
while(i!=combi.tableau.end())
{
if(*i==n)
compteur++;
i++;
}
return compteur;
}
combi est un C_Tab.
et j'ai cette erreur :
C:/Dev-Cpp/include/c++/bits/stl_iterator.h: In constructor
`__gnu_cxx::__normal_iterator<_Iterator,
_Container>::__normal_iterator(const __gnu_cxx::__normal_iterator<_Iter,
_Container>&) [with _Iter = const int*, _Iterator = int*, _Container > std::vector<int, std::allocator<int> >]':
D:/...yathzee1.cpp:93: instantiated from here
C:/...: invalid conversion from `const
int* const' to `int*'
sur la ligne d'initialisation de l'itérateur...
Dans ta fonction compte() qui est const, la variable membre combi est
egalement const (rappelle-toi les reponses sur le type de this dans une
fonction membre const).
De meme, comme combi est const, sa variable membre tableau est const.
Il y a deux fonctions begin() dans std::vector (et toutes les autres
collections):
- iterator begin();
- const_iterator begin() const;
(idem pour end())
le type vector<int>::iterator a la meme semantique que le type int*.
le type vector<int>::const_iterator a la meme semantique que le type
const int*.
tableau etant const, c'est la deuxieme fonction membre begin qui est
choisie par le compilateur.
concernant les iterator j'ai compris l'intérêt je pense, cependant j'ai une erreur lors de la compilation que je ne comprends pas du tout :
class C_Tab { public: vector <int> tableau; int somme(vector <int> tab); C_Tab(); };
int C_Des::compte(int n) const { int compteur=0; vector<int>::iterator i= combi.tableau.begin(); while(i!=combi.tableau.end()) { if(*i==n) compteur++; i++; } return compteur; }
combi est un C_Tab.
et j'ai cette erreur : C:/Dev-Cpp/include/c++/bits/stl_iterator.h: In constructor `__gnu_cxx::__normal_iterator<_Iterator, _Container>::__normal_iterator(const __gnu_cxx::__normal_iterator<_Iter, _Container>&) [with _Iter = const int*, _Iterator = int*, _Container > std::vector<int, std::allocator<int> >]':
D:/...yathzee1.cpp:93: instantiated from here
C:/...: invalid conversion from `const int* const' to `int*'
sur la ligne d'initialisation de l'itérateur...
Dans ta fonction compte() qui est const, la variable membre combi est egalement const (rappelle-toi les reponses sur le type de this dans une fonction membre const).
De meme, comme combi est const, sa variable membre tableau est const.
Il y a deux fonctions begin() dans std::vector (et toutes les autres collections): - iterator begin(); - const_iterator begin() const; (idem pour end())
le type vector<int>::iterator a la meme semantique que le type int*. le type vector<int>::const_iterator a la meme semantique que le type const int*.
tableau etant const, c'est la deuxieme fonction membre begin qui est choisie par le compilateur.
Or tu as ecrit:
vector<int>::iterator i= combi.tableau.begin();
...
Bertrand.
Nicolas Aunai
"Bertrand Motuelle" avait énoncé :
le type vector<int>::iterator a la meme semantique que le type int*. le type vector<int>::const_iterator a la meme semantique que le type const int*.
tableau etant const, c'est la deuxieme fonction membre begin qui est choisie par le compilateur.
Or tu as ecrit:
vector<int>::iterator i= combi.tableau.begin();
ah ouais, donc on ne peut pas créer d'iterateur sur des objet constant, c'est dommage ça... car c'est pas parce qu'un objet est constant qu'on n'a pas besoin de le parcourir où d'accéder facilement avec un itérateur....
je demande qd même.... est-ce que je peux, avec mon vector constant, choisir de forcer le compilateur a utiliser un iterateur non constant ? comment ?
le type vector<int>::iterator a la meme semantique que le type int*.
le type vector<int>::const_iterator a la meme semantique que le type const
int*.
tableau etant const, c'est la deuxieme fonction membre begin qui est choisie
par le compilateur.
Or tu as ecrit:
vector<int>::iterator i= combi.tableau.begin();
ah ouais, donc on ne peut pas créer d'iterateur sur des objet constant,
c'est dommage ça... car c'est pas parce qu'un objet est constant qu'on
n'a pas besoin de le parcourir où d'accéder facilement avec un
itérateur....
je demande qd même.... est-ce que je peux, avec mon vector constant,
choisir de forcer le compilateur a utiliser un iterateur non constant ?
comment ?
le type vector<int>::iterator a la meme semantique que le type int*. le type vector<int>::const_iterator a la meme semantique que le type const int*.
tableau etant const, c'est la deuxieme fonction membre begin qui est choisie par le compilateur.
Or tu as ecrit:
vector<int>::iterator i= combi.tableau.begin();
ah ouais, donc on ne peut pas créer d'iterateur sur des objet constant, c'est dommage ça... car c'est pas parce qu'un objet est constant qu'on n'a pas besoin de le parcourir où d'accéder facilement avec un itérateur....
je demande qd même.... est-ce que je peux, avec mon vector constant, choisir de forcer le compilateur a utiliser un iterateur non constant ? comment ?
ah ouais, donc on ne peut pas créer d'iterateur sur des objet constant, c'est dommage ça... car c'est pas parce qu'un objet est constant qu'on n'a pas besoin de le parcourir où d'accéder facilement avec un itérateur....
Si on peut, mais avec un const_iterator, qui a le même comportement que iterator mis à part l'impossibilité d'en modifier l'objet pointé (ce qui serait le cas avec un int const *).
je demande qd même.... est-ce que je peux, avec mon vector constant, choisir de forcer le compilateur a utiliser un iterateur non constant ? comment ?
Tu dois pouvoir faire un const_cast de ton vecteur, mais bien souvent si on en arrive là il y a un problème de conception.
A+
Christophe
Nicolas Aunai wrote:
ah ouais, donc on ne peut pas créer d'iterateur sur des objet constant,
c'est dommage ça... car c'est pas parce qu'un objet est constant qu'on
n'a pas besoin de le parcourir où d'accéder facilement avec un
itérateur....
Si on peut, mais avec un const_iterator, qui a le même comportement que
iterator mis à part l'impossibilité d'en modifier l'objet pointé (ce qui
serait le cas avec un int const *).
je demande qd même.... est-ce que je peux, avec mon vector constant,
choisir de forcer le compilateur a utiliser un iterateur non constant ?
comment ?
Tu dois pouvoir faire un const_cast de ton vecteur, mais bien souvent si
on en arrive là il y a un problème de conception.
ah ouais, donc on ne peut pas créer d'iterateur sur des objet constant, c'est dommage ça... car c'est pas parce qu'un objet est constant qu'on n'a pas besoin de le parcourir où d'accéder facilement avec un itérateur....
Si on peut, mais avec un const_iterator, qui a le même comportement que iterator mis à part l'impossibilité d'en modifier l'objet pointé (ce qui serait le cas avec un int const *).
je demande qd même.... est-ce que je peux, avec mon vector constant, choisir de forcer le compilateur a utiliser un iterateur non constant ? comment ?
Tu dois pouvoir faire un const_cast de ton vecteur, mais bien souvent si on en arrive là il y a un problème de conception.
A+
Christophe
tib.motuelle
Nicolas Aunai ç wrote in message news:...
"Bertrand Motuelle" avait énoncé :
Or tu as ecrit:
vector<int>::iterator i= combi.tableau.begin();
ah ouais, donc on ne peut pas créer d'iterateur sur des objet constant, c'est dommage ça...
Bien sur que si. Comment arrives-tu a cette conclusion ? Tu peux itérer sur une collection constante avec les const_iterator de cette collection. La difference avec les iterator, c'est que les const_iterator ne permettent pas de modifier l'elément pointé.
for (; it != end; ++it) { std::cout << *it << "n"; // OK *it = 1; // PAS OK. Ne compilera pas }
Pour revenir à ce que tu avais posté (tu avais demandé des indices, pas la solution, mais bon):
vector<int>::iterator i= combi.tableau.begin();
Changer cette ligne en... vector<int>::const_iterator i = combi.tableau.begin(); ... devrait régler ton problème.
je demande qd même.... est-ce que je peux, avec mon vector constant, choisir de forcer le compilateur a utiliser un iterateur non constant ? comment ? C'est possible (en faisant un const_cast sur ta collection) mais pas
conseillé. Tu risques fort de t'exposer à des comportements indéfinis en procédant ainsi.
Bertrand.
Nicolas Aunai <nicolas.aunai@virerça@free.fr> wrote in message news:<mesnews.d1db7d3b.ec450182.292.1437@free.fr>...
"Bertrand Motuelle" avait énoncé :
Or tu as ecrit:
vector<int>::iterator i= combi.tableau.begin();
ah ouais, donc on ne peut pas créer d'iterateur sur des objet constant,
c'est dommage ça...
Bien sur que si. Comment arrives-tu a cette conclusion ?
Tu peux itérer sur une collection constante avec les const_iterator de
cette collection. La difference avec les iterator, c'est que les
const_iterator ne permettent pas de modifier l'elément pointé.
for (; it != end; ++it)
{
std::cout << *it << "n"; // OK
*it = 1; // PAS OK. Ne compilera pas
}
Pour revenir à ce que tu avais posté (tu avais demandé des indices,
pas la solution, mais bon):
vector<int>::iterator i= combi.tableau.begin();
Changer cette ligne en...
vector<int>::const_iterator i = combi.tableau.begin();
... devrait régler ton problème.
je demande qd même.... est-ce que je peux, avec mon vector constant,
choisir de forcer le compilateur a utiliser un iterateur non constant ?
comment ?
C'est possible (en faisant un const_cast sur ta collection) mais pas
conseillé. Tu risques fort de t'exposer à des comportements indéfinis
en procédant ainsi.
ah ouais, donc on ne peut pas créer d'iterateur sur des objet constant, c'est dommage ça...
Bien sur que si. Comment arrives-tu a cette conclusion ? Tu peux itérer sur une collection constante avec les const_iterator de cette collection. La difference avec les iterator, c'est que les const_iterator ne permettent pas de modifier l'elément pointé.
for (; it != end; ++it) { std::cout << *it << "n"; // OK *it = 1; // PAS OK. Ne compilera pas }
Pour revenir à ce que tu avais posté (tu avais demandé des indices, pas la solution, mais bon):
vector<int>::iterator i= combi.tableau.begin();
Changer cette ligne en... vector<int>::const_iterator i = combi.tableau.begin(); ... devrait régler ton problème.
je demande qd même.... est-ce que je peux, avec mon vector constant, choisir de forcer le compilateur a utiliser un iterateur non constant ? comment ? C'est possible (en faisant un const_cast sur ta collection) mais pas
conseillé. Tu risques fort de t'exposer à des comportements indéfinis en procédant ainsi.
Bertrand.
Luc Hermitte
Nicolas Aunai ç wrote in news::
int C_Des::compte(int n) const { int compteur=0; vector<int>::const_iterator i= combi.tableau.begin();
| concernant les iterator j'ai compris l'intérêt je pense, cependant | j'ai une erreur lors de la compilation que je ne comprends pas du tout | : | | class C_Tab | { | | public: | vector <int> tableau; | int somme(vector <int> tab); | C_Tab(); | }; | | | int C_Des::compte(int n) const | { | int compteur=0; | vector<int>::iterator i= combi.tableau.begin();
probablement que combi est « const » ? dans ce cas que l'iterateur que te donne begin() est un std::vector<T>::const_iterator, qui n'est pas convertible en un std::vector<T>::iterator.
| concernant les iterator j'ai compris l'intérêt je pense, cependant
| j'ai une erreur lors de la compilation que je ne comprends pas du tout
| :
|
| class C_Tab
| {
|
| public:
| vector <int> tableau;
| int somme(vector <int> tab);
| C_Tab();
| };
|
|
| int C_Des::compte(int n) const
| {
| int compteur=0;
| vector<int>::iterator i= combi.tableau.begin();
probablement que combi est « const » ? dans ce cas que l'iterateur que
te donne begin() est un std::vector<T>::const_iterator, qui n'est pas
convertible en un std::vector<T>::iterator.
| concernant les iterator j'ai compris l'intérêt je pense, cependant | j'ai une erreur lors de la compilation que je ne comprends pas du tout | : | | class C_Tab | { | | public: | vector <int> tableau; | int somme(vector <int> tab); | C_Tab(); | }; | | | int C_Des::compte(int n) const | { | int compteur=0; | vector<int>::iterator i= combi.tableau.begin();
probablement que combi est « const » ? dans ce cas que l'iterateur que te donne begin() est un std::vector<T>::const_iterator, qui n'est pas convertible en un std::vector<T>::iterator.
-- Gaby
--=-=-=--
Nicolas Aunai
toujours concernant les iterator...
j'ai une petite fonction qui me pose problème, ai-je le droit si je dispose d'un itérateur sur objet constant de l'utiliser ainsi :
int C_Tab::somme() const { int sum=0; cout<<"somme"<<endl; vector<int>::const_iterator iter = tableau.begin(); while(iter!=tableau.end()) { sum+=*iter; } cout<<"somme faite"<<endl; return sum; }
a l'execution j'ai mes deux cout me prouvent qu'il coince avant la fin de la fonction, et si je tente de faire un cout<<*iter; j'ai un bug a l'affichage
j'ai une petite fonction qui me pose problème, ai-je le droit si je
dispose d'un itérateur sur objet constant de l'utiliser ainsi :
int C_Tab::somme() const
{
int sum=0;
cout<<"somme"<<endl;
vector<int>::const_iterator iter = tableau.begin();
while(iter!=tableau.end())
{
sum+=*iter;
}
cout<<"somme faite"<<endl;
return sum;
}
a l'execution j'ai mes deux cout me prouvent qu'il coince avant la fin
de la fonction, et si je tente de faire un cout<<*iter; j'ai un bug a
l'affichage
j'ai une petite fonction qui me pose problème, ai-je le droit si je dispose d'un itérateur sur objet constant de l'utiliser ainsi :
int C_Tab::somme() const { int sum=0; cout<<"somme"<<endl; vector<int>::const_iterator iter = tableau.begin(); while(iter!=tableau.end()) { sum+=*iter; } cout<<"somme faite"<<endl; return sum; }
a l'execution j'ai mes deux cout me prouvent qu'il coince avant la fin de la fonction, et si je tente de faire un cout<<*iter; j'ai un bug a l'affichage