OVH Cloud OVH Cloud

iterator

10 réponses
Avatar
Nicolas Aunai
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...


un indice ?

--
Nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@hotmail.com

10 réponses

Avatar
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.

Avatar
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 ?

--
Nico,
http://astrosurf.com/nicoastro
messenger :


Avatar
Christophe de VIENNE
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.

A+

Christophe

Avatar
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é.

const std::vector<int> v(10);
std::vector<int>::const_iterator it(v.begin());
std::vector<int>::const_iterator end(v.end());

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.



Avatar
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();


while(i!=combi.tableau.end())
{
if(*i==n)
compteur++;
i++;
}

return compteur;
}


Accessoirement, ton truc peut se faire avec std::accumulate aussi.


--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>

Avatar
Nicolas Aunai
Le 26/11/2003, "Bertrand Motuelle" a dit :


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.




ah ouais ok, j'avais lu trop vite et ma compris ta 1ere réponse, merci
à tous pour le coup de main !

--
Nico,
http://astrosurf.com/nicoastro
messenger :


Avatar
Gabriel Dos Reis
--=-=- Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

Nicolas Aunai ç writes:

--=-=- Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: 8bit


| 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();

--=-=- Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit


C'est quoi « combi » ?

|
| while(i!=combi.tableau.end())
| {
| if(*i==n)
| compteur++;
| i++;
| }

return std::count(combi.tableau.begin(), combi.tableau.end(), n);

std::count se trouve dans <algorithm>.

[...]

--=-=- Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: 8bit


| C:/...: invalid conversion from `const
| int* const' to `int*'
|
| sur la ligne d'initialisation de l'itérateur...

--=-=- Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit


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

--=-=-=--
Avatar
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

qqn voit l'erreur ?

merci

--
Nico,
http://astrosurf.com/nicoastro
messenger :
Avatar
Nicolas Aunai
salut


comment obtenir un iterator sur une position donnée d'un vector

exemple :

vector<int>::const_iterator iter= tableau.???


merci

--
Nico,
http://astrosurf.com/nicoastro
messenger :
Avatar
Gabriel Dos Reis
--=-=- Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

Nicolas Aunai ç writes:

--=-=- Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: 8bit


| salut
|
|
| comment obtenir un iterator sur une position donnée d'un vector
|
| exemple :
|
| vector<int>::const_iterator iter= tableau.???

tableau.begin() + position

-- Gaby

--=-=-=--