Connecting Tech Pros Worldwide Forums | Help | Site Map

STL list::iterator problem

jayesah@gmail.com
Guest
 
Posts: n/a
#1: Nov 24 '06
Hi All,

List and its iterator work as following way :

list<intmylist;
list<int>::iterator itr;
itr = mylist.begin();
cout << (*itr);

But I want something like this:

list<intmylist;
MyIterator itr(mylist);
cout<< (*itr);


So I wrote MyIterator following way :

template <class Tclass MyIterator : public list<T>::iterator
{
public:
MyIterator() { };

~MyIterator() { };

MyIterator(list<T>& mylist) {

/* What I should write here */
};
};

int main()
{
list<intmylist;
mylist.push_back(1);
mylist.push_back(2);

/* I want to support following construct */

MyIterator iter(mylist);
cout <<*mylist;

return 0;
}

Can anybody please guide me what I should write in one parameter
constructor ? Or do you have all together different solution ?

The reason I derived MyIterator from list<T>::iterator is that I want
to support all the overloaded operator that list<T>::iterator supports.

Thanks
Jayesh Shah


Markus Moll
Guest
 
Posts: n/a
#2: Nov 24 '06

re: STL list::iterator problem


Hi

jayesah@gmail.com wrote:
Quote:
List and its iterator work as following way :
>
list<intmylist;
list<int>::iterator itr;
itr = mylist.begin();
cout << (*itr);
>
But I want something like this:
>
list<intmylist;
MyIterator itr(mylist);
cout<< (*itr);
What is the difference? MyIterator will need to be some template, as
otherwise you cannot distinguish different element types. So it would
probably be MyIterator<int>. I can't see any difference to
list<int>::iterator.

Markus

Kai-Uwe Bux
Guest
 
Posts: n/a
#3: Nov 24 '06

re: STL list::iterator problem


jayesah@gmail.com wrote:
Quote:
Hi All,
>
List and its iterator work as following way :
>
list<intmylist;
list<int>::iterator itr;
itr = mylist.begin();
cout << (*itr);
>
But I want something like this:
>
list<intmylist;
MyIterator itr(mylist);
cout<< (*itr);
Why? Looks like a BadIdea(tm) to me.


Quote:
So I wrote MyIterator following way :
>
template <class Tclass MyIterator : public list<T>::iterator
Note: there is no guarantee that list<T>::iterator is inheritable. However,
this will not be a problem in practice since, as far as I know, all widely
used implementations implement list<>::iterator as a class without
finalizing trickery.

Quote:
{
public:
MyIterator() { };
>
~MyIterator() { };
>
MyIterator(list<T>& mylist) {
>
/* What I should write here */
};
You need to construct the base:

MyIterator ( list<T& mylist )
: list<T>::iterator( mylist.begin() )
{}

(untested)
Quote:
};
>
int main()
{
list<intmylist;
mylist.push_back(1);
mylist.push_back(2);
>
/* I want to support following construct */
>
MyIterator iter(mylist);
cout <<*mylist;
>
return 0;
}
And how do you intend to use these iterators in a loop:

MyIterator itr ( mylist );
while ( itr != ??? ) {
...
++itr;
}

Quote:
Can anybody please guide me what I should write in one parameter
constructor ? Or do you have all together different solution ?
Yes: use mylist.begin() and mylist.end().

[snip]


Best

Kai-Uwe Bux
eriwik@student.chalmers.se
Guest
 
Posts: n/a
#4: Nov 24 '06

re: STL list::iterator problem


On Nov 24, 1:34 pm, jaye...@gmail.com wrote:
Quote:
Hi All,
>
List and its iterator work as following way :
>
list<intmylist;
list<int>::iterator itr;
itr = mylist.begin();
cout << (*itr);
>
But I want something like this:
>
list<intmylist;
MyIterator itr(mylist);
cout<< (*itr);
I'll admit that I have not tested this but I'm quite sure that
STL-iterators have a copy-constructor so something like this ought to
work:

#include <list>
#include <iostream>

typedef MyList std::list<int>
typedef MyIterator std::list<int>::iterator

MyList l;
MyIterator itr(l.begin());
std::cout << *itr;
Quote:
>template <class Tclass MyIterator : public list<T>::iterator
>{
public:
MyIterator() { };
>
~MyIterator() { };
>
MyIterator(list<T>& mylist) {
>
/* What I should write here */
};
>
>};
If you realy want to do it your way I think you need to initialize the
base of your derived class like this (again, untested):

#include <list>
#include <iostream>

template <class Tclass MyIterator : public list<T>::iterator
{
MyIterator (std::list<T>& l)
: std::list<T>::iterator(l.begin())
{ };
};

int main()
{
std::list<intl;
l.push_back(2);
MyIterator<intiter(l);
std::cout << *iter;
return 0;
}

Notice the template parameter, like Markus pointed out, when creating
an instance of the MyIterator-class.

--
Erik Wikström

Daniel T.
Guest
 
Posts: n/a
#5: Nov 24 '06

re: STL list::iterator problem


In article <1164371649.562271.119830@l12g2000cwl.googlegroups .com>,
jayesah@gmail.com wrote:
Quote:
Hi All,
>
List and its iterator work as following way :
>
list<intmylist;
list<int>::iterator itr;
itr = mylist.begin();
cout << (*itr);
>
But I want something like this:
>
list<intmylist;
MyIterator itr(mylist);
cout<< (*itr);
Why? What problem does this solve? I can understand writing algorithms
that take whole containers rather than 'begin' and 'end' but this? I
don't get it.
Quote:
So I wrote MyIterator following way :
>
template <class Tclass MyIterator : public list<T>::iterator
{
public:
MyIterator() { };
>
~MyIterator() { };
>
MyIterator(list<T>& mylist) {
>
/* What I should write here */
};
};
>
int main()
{
list<intmylist;
mylist.push_back(1);
mylist.push_back(2);
>
/* I want to support following construct */
>
MyIterator iter(mylist);
cout <<*mylist;
>
return 0;
}
>
Can anybody please guide me what I should write in one parameter
constructor ? Or do you have all together different solution ?
>
The reason I derived MyIterator from list<T>::iterator is that I want
to support all the overloaded operator that list<T>::iterator supports.
What about all the other iterators? Anything you write in MyIterator
should work just as well with any other bi-directional iterator yet you
only derived from list<T>::iterator. That seems quite limiting.

I have an idea though...

template < typename Con >
class MyIterator
{
Con& container;
typename Con::iterator pos;
public:
typedef typename Con::reference reference;

MyIterator( Con& c ): container( c ), pos( c.begin() ) { }

reference operator*() {
return *pos;
}
};

int main() {
list<intmyList;
MyIterator<list<int itr( myList );
cout << (*itr);
}

--
To send me email, put "sheltie" in the subject.
Jim Langston
Guest
 
Posts: n/a
#6: Nov 24 '06

re: STL list::iterator problem


<jayesah@gmail.comwrote in message
news:1164371649.562271.119830@l12g2000cwl.googlegr oups.com...
Quote:
Hi All,
>
List and its iterator work as following way :
>
list<intmylist;
list<int>::iterator itr;
itr = mylist.begin();
cout << (*itr);
>
But I want something like this:
>
list<intmylist;
MyIterator itr(mylist);
cout<< (*itr);
>
>
So I wrote MyIterator following way :
>
template <class Tclass MyIterator : public list<T>::iterator
{
public:
MyIterator() { };
>
~MyIterator() { };
>
MyIterator(list<T>& mylist) {
>
/* What I should write here */
};
};
>
int main()
{
list<intmylist;
mylist.push_back(1);
mylist.push_back(2);
>
/* I want to support following construct */
>
MyIterator iter(mylist);
cout <<*mylist;
>
return 0;
}
>
Can anybody please guide me what I should write in one parameter
constructor ? Or do you have all together different solution ?
>
The reason I derived MyIterator from list<T>::iterator is that I want
to support all the overloaded operator that list<T>::iterator supports.
>
Thanks
Jayesh Shah
I think the problem you're going to run into is that mylist really doesn't
know what it is. That is, you really want:
MyIterator iter(mylist);
to expand to
MyIterator iter(list<int>);
or the like (although that above won't compile I"m sure).

I understand why you want to do this, and it would be nice, but I really
don't think it's possible The way I deal with it is by using typedef.

typedef list<intDataList;

DataList MyList;
DataList::iterator it = MyList.begin();
std::cout << (*itr);

I don't really think you can generically create an iterator off a generic
container. It would be nice if you could, but still, what if it's a map?
Then you have .first() and .second() which a list doesn't have, etc...



jayesah@gmail.com
Guest
 
Posts: n/a
#7: Nov 25 '06

re: STL list::iterator problem



Kai-Uwe Bux wrote:
Quote:
jayesah@gmail.com wrote:
>
Quote:
Hi All,

List and its iterator work as following way :

list<intmylist;
list<int>::iterator itr;
itr = mylist.begin();
cout << (*itr);

But I want something like this:

list<intmylist;
MyIterator itr(mylist);
cout<< (*itr);
>
Why? Looks like a BadIdea(tm) to me.
>
>
>
Quote:
So I wrote MyIterator following way :

template <class Tclass MyIterator : public list<T>::iterator
>
Note: there is no guarantee that list<T>::iterator is inheritable. However,
this will not be a problem in practice since, as far as I know, all widely
used implementations implement list<>::iterator as a class without
finalizing trickery.
>
>
Quote:
{
public:
MyIterator() { };

~MyIterator() { };

MyIterator(list<T>& mylist) {

/* What I should write here */
};
>
You need to construct the base:
>
MyIterator ( list<T& mylist )
: list<T>::iterator( mylist.begin() )
{}
>
(untested)
>
Quote:
};

int main()
{
list<intmylist;
mylist.push_back(1);
mylist.push_back(2);

/* I want to support following construct */

MyIterator iter(mylist);
cout <<*mylist;

return 0;
}
>
And how do you intend to use these iterators in a loop:
>
MyIterator itr ( mylist );
while ( itr != ??? ) {
...
++itr;
}
>
>
Quote:
Can anybody please guide me what I should write in one parameter
constructor ? Or do you have all together different solution ?
>
Yes: use mylist.begin() and mylist.end().
>
[snip]
>
>
Best
>
Kai-Uwe Bux
Thanks a lot Bux.
You said there is no guarantee that list<T>::iterator is inheritable.
Is it defined in spec ?
How come you implement a iterator without the class since you have lots
of operator to overload ?

Kai-Uwe Bux
Guest
 
Posts: n/a
#8: Nov 25 '06

re: STL list::iterator problem


jayesah@gmail.com wrote:

Quote:
Thanks a lot Bux.
You said there is no guarantee that list<T>::iterator is inheritable.
Is it defined in spec ?
By "spec" you mean the C++ standard? No, it's not defined in the standard.
That's why there is no guarantee. The type list<T>::iterator is marked
as "implementation defined".

For std::vector<T>, for instance, an implementation is free to use T* as an
iterator. In that case, std::vector<T>::iterator would not be a class.

For std::list<T>, an implementation is free to use trickery (using virtual
base classes) to prevent inheritance. (Although, to my knowledge, no
implementation actually does that.)

Quote:
How come you implement a iterator without the class since you have lots
of operator to overload ?
Huh? I do not understand, and I think that sentence just does not parse. I
am not a native speaker of English, so my parser has little tolerance and
is very limited with regard to error correction.


Best

Kai-Uwe Bux
jayesah@gmail.com
Guest
 
Posts: n/a
#9: Nov 25 '06

re: STL list::iterator problem



Daniel T. wrote:
Quote:
In article <1164371649.562271.119830@l12g2000cwl.googlegroups .com>,
jayesah@gmail.com wrote:
>
Quote:
Hi All,

List and its iterator work as following way :

list<intmylist;
list<int>::iterator itr;
itr = mylist.begin();
cout << (*itr);

But I want something like this:

list<intmylist;
MyIterator itr(mylist);
cout<< (*itr);
>
Why? What problem does this solve? I can understand writing algorithms
that take whole containers rather than 'begin' and 'end' but this? I
don't get it.
>
Quote:
So I wrote MyIterator following way :

template <class Tclass MyIterator : public list<T>::iterator
{
public:
MyIterator() { };

~MyIterator() { };

MyIterator(list<T>& mylist) {

/* What I should write here */
};
};

int main()
{
list<intmylist;
mylist.push_back(1);
mylist.push_back(2);

/* I want to support following construct */

MyIterator iter(mylist);
cout <<*mylist;

return 0;
}

Can anybody please guide me what I should write in one parameter
constructor ? Or do you have all together different solution ?

The reason I derived MyIterator from list<T>::iterator is that I want
to support all the overloaded operator that list<T>::iterator supports.
>
What about all the other iterators? Anything you write in MyIterator
should work just as well with any other bi-directional iterator yet you
only derived from list<T>::iterator. That seems quite limiting.
>
I have an idea though...
>
template < typename Con >
class MyIterator
{
Con& container;
typename Con::iterator pos;
public:
typedef typename Con::reference reference;
>
MyIterator( Con& c ): container( c ), pos( c.begin() ) { }
>
reference operator*() {
return *pos;
}
};
>
int main() {
list<intmyList;
MyIterator<list<int itr( myList );
cout << (*itr);
}
>
--
To send me email, put "sheltie" in the subject.

Absolutely a brilliant solution.....

You suggested the usage as :
MyIterator<list<int itr( myList );

But I want to use as

MySlistIterator itr(list); // I can not change this usage

So what I thought is

template<class Ttypedef MyIterator<list< T MySlisIterator<T>;

but this is not supported in c++..what can be the alternative ??

Thanks a lot again..........

Daniel T.
Guest
 
Posts: n/a
#10: Nov 25 '06

re: STL list::iterator problem


jayesah@gmail.com wrote:
Quote:
You suggested the usage as :
MyIterator<list<int itr( myList );
>
But I want to use as
>
MySlistIterator itr(list); // I can not change this usage
Why? What problem does this solve?

--
To send me email, put "sheltie" in the subject.
jayesah@gmail.com
Guest
 
Posts: n/a
#11: Nov 27 '06

re: STL list::iterator problem



Daniel T. wrote:
Quote:
jayesah@gmail.com wrote:
>
Quote:
You suggested the usage as :
MyIterator<list<int itr( myList );

But I want to use as

MySlistIterator itr(list); // I can not change this usage
>
Why? What problem does this solve?
>
--
To send me email, put "sheltie" in the subject.

I am replacing existing code, which has the syntax, I described.

Daniel T.
Guest
 
Posts: n/a
#12: Nov 27 '06

re: STL list::iterator problem


jayesah@gmail.com wrote:
Quote:
Daniel T. wrote:
Quote:
>jayesah@gmail.com wrote:
>>
Quote:
>>You suggested the usage as : MyIterator<list<int itr( myList );
>>>
>>But I want to use as
>>>
>>MySlistIterator itr(list); // I can not change this usage
>>
>Why? What problem does this solve?
>
I am replacing existing code, which has the syntax, I described.
And you have to maintain the same interface? In that case, show me the
interface of MySlistIterator and I'll see if I can help.

--
To send me email, put "sheltie" in the subject.
jayesah@gmail.com
Guest
 
Posts: n/a
#13: Nov 28 '06

re: STL list::iterator problem



Daniel T. wrote:
Quote:
jayesah@gmail.com wrote:
Quote:
Daniel T. wrote:
Quote:
jayesah@gmail.com wrote:
>
>You suggested the usage as : MyIterator<list<int itr( myList );
>>
>But I want to use as
>>
>MySlistIterator itr(list); // I can not change this usage
>
Why? What problem does this solve?
I am replacing existing code, which has the syntax, I described.
>
And you have to maintain the same interface? In that case, show me the
interface of MySlistIterator and I'll see if I can help.
>
--
To send me email, put "sheltie" in the subject.

MySlistIterator itr(list);

while( itr() )
{
cout << *itr;

}

Daniel T.
Guest
 
Posts: n/a
#14: Nov 28 '06

re: STL list::iterator problem


jayesah@gmail.com wrote:
Quote:
Daniel T. wrote:
Quote:
>jayesah@gmail.com wrote:
Quote:
>>Daniel T. wrote:
>>>jayesah@gmail.com wrote:
>>>>
>>>>You suggested the usage as : MyIterator<list<int itr( myList
>>>>);
>>>>>
>>>>But I want to use as
>>>>>
>>>>MySlistIterator itr(list); // I can not change this usage
>>>>
>>>Why? What problem does this solve?
>>>
>>I am replacing existing code, which has the syntax, I described.
>>
>And you have to maintain the same interface? In that case, show me
>the interface of MySlistIterator and I'll see if I can help.
>
MySlistIterator itr(list);
>
while( itr() )
{
cout << *itr;
}
That isn't an interface. What are the public member-functions that
MySlistIterator must support? What does the existing MySlistIterator
class look like?

class MySlistIterator
{
public:
// what's here?
};

--
To send me email, put "sheltie" in the subject.
jayesah@gmail.com
Guest
 
Posts: n/a
#15: Nov 29 '06

re: STL list::iterator problem



Daniel T. wrote:
Quote:
jayesah@gmail.com wrote:
Quote:
Daniel T. wrote:
Quote:
jayesah@gmail.com wrote:
>Daniel T. wrote:
>>jayesah@gmail.com wrote:
>>>
>>>You suggested the usage as : MyIterator<list<int itr( myList
>>>);
>>>>
>>>But I want to use as
>>>>
>>>MySlistIterator itr(list); // I can not change this usage
>>>
>>Why? What problem does this solve?
>>
>I am replacing existing code, which has the syntax, I described.
>
And you have to maintain the same interface? In that case, show me
the interface of MySlistIterator and I'll see if I can help.
MySlistIterator itr(list);

while( itr() )
{
cout << *itr;
}
>
That isn't an interface. What are the public member-functions that
MySlistIterator must support? What does the existing MySlistIterator
class look like?
>
class MySlistIterator
{
public:
// what's here?
};
>
--
To send me email, put "sheltie" in the subject.
MySlistIterator is implemented in a custom library which source code is
not available. Thats why I have only the usage interface and nothing
much.

So I planned to create a iterator class for each collection. But I
liked your solution: one iterator for all collection. Unfortunately I
am not allowed to change the existing source code, and template typedef
syntax is not supported in C++, I am not able to use your solution.

Daniel T.
Guest
 
Posts: n/a
#16: Nov 29 '06

re: STL list::iterator problem


jayesah@gmail.com wrote:
Quote:
Daniel T. wrote:
>
Quote:
>What are the public member-functions that MySlistIterator must
>support? What does the existing MySlistIterator class look like?
>>
>class MySlistIterator
>{
>public:
> // what's here?
>};
>
MySlistIterator is implemented in a custom library which source code
is not available. Thats why I have only the usage interface and
nothing much.
I'm not asking for the source code. Post the class definition from the
header.

--
To send me email, put "sheltie" in the subject.
Closed Thread