473,394 Members | 1,866 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,394 software developers and data experts.

STL list::iterator problem

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

Nov 24 '06 #1
15 2732
Hi

ja*****@gmail.com wrote:
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

Nov 24 '06 #2
ja*****@gmail.com wrote:
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.
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.

{
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)
};

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;
}

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
Nov 24 '06 #3
On Nov 24, 1:34 pm, jaye...@gmail.com wrote:
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;
>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

Nov 24 '06 #4
In article <11**********************@l12g2000cwl.googlegroups .com>,
ja*****@gmail.com wrote:
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.
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.
Nov 24 '06 #5
<ja*****@gmail.comwrote in message
news:11**********************@l12g2000cwl.googlegr oups.com...
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...

Nov 24 '06 #6

Kai-Uwe Bux wrote:
ja*****@gmail.com wrote:
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.
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.

{
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)
};

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;
}

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 ?

Nov 25 '06 #7
ja*****@gmail.com wrote:

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

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
Nov 25 '06 #8

Daniel T. wrote:
In article <11**********************@l12g2000cwl.googlegroups .com>,
ja*****@gmail.com wrote:
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.
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..........

Nov 25 '06 #9
ja*****@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?

--
To send me email, put "sheltie" in the subject.
Nov 25 '06 #10

Daniel T. wrote:
ja*****@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?

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

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

Nov 27 '06 #11
ja*****@gmail.com wrote:
Daniel T. wrote:
>ja*****@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.
Nov 27 '06 #12

Daniel T. wrote:
ja*****@gmail.com wrote:
Daniel T. wrote:
ja*****@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;

}

Nov 28 '06 #13
ja*****@gmail.com wrote:
Daniel T. wrote:
>ja*****@gmail.com wrote:
>>Daniel T. wrote:
ja*****@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.
Nov 28 '06 #14

Daniel T. wrote:
ja*****@gmail.com wrote:
Daniel T. wrote:
ja*****@gmail.com wrote:
Daniel T. wrote:
ja*****@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.

Nov 29 '06 #15
ja*****@gmail.com wrote:
Daniel T. wrote:
>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.
Nov 29 '06 #16

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

7
by: sam | last post by:
Hi, This is a "list iterator" problem I expect it will copy the list iterator (l_iter) to the caller: eg. list<HashMap>::iterator AcctConfParser::find_Acct_rule(string i) {...
15
by: sandwich_eater | last post by:
I want to know how to set an std::list iterator variable to make it null or nil. If this is not possible what is the value of an uninitialised std::list iterator and is it ok to assign this value...
5
by: gerg | last post by:
I'm having to deal with some legacy code which I think may be causeing some problems. Can STL pro's please add comments about the correctness of the following code: class A { public: /// ......
8
by: freckred76 | last post by:
Hi, I think this might be a VC++ problem. I am using Microsoft Visual Studio 2005 Full Version (8.0). I have a simple for loop that iterates over a list using the standard iterator. The...
3
by: Amit Bhatia | last post by:
User-Agent: OSXnews 2.081 Xref: number1.nntp.dca.giganews.com comp.lang.c++:818044 Hi, I am wondering if I can assign a list iterator = NULL. Suppose I have a class A: A.h class A{ //ctors...
6
by: Jason S | last post by:
where is the behavior of list::iterator specified? I need to keep track of ranges of data, all I can figure out so far is that iterators are guaranteed to be valid unless you remove the elements...
2
by: Rohit.MEHTA | last post by:
Hi All I want to overload the ++ and - operator for stl list iterator so that I could do some thing additional in that As want to set the current node status also Can some one please post...
1
by: vishnu vardhan K S | last post by:
Hi, I couldn't use List iterator in side a constant function. if i use like this given below Buffer& ArqFeedbackMessage::encodeArqFeedbackMessage() const { Buffer* encodedMsg = new...
1
by: David Bilsby | last post by:
All Apologies for cross posing this but I am not sure if this is a VC 8 STL bug or simply an invalid use of the iterator. I have a PCI card access class which basically abstracts a third party...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.