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 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 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
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
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.
<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...
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 ? 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
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.......... 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.
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. 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.
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;
} 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.
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. 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. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
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)
{...
|
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...
|
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:
/// ......
|
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...
|
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...
|
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...
|
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...
|
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...
|
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...
|
by: Charles Arthur |
last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
|
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...
|
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
|
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...
|
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...
|
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,...
|
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...
|
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...
|
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...
| |