Re: Problem with const_iterators for containers
Kaba wrote:
[const_iterator not usable for erase]
I just ran to this problem. However, because the container was mine, I
could change my interface so that const_iterators did the job.
[...]
There is an easy way out of this problem. The solution is to add to the
container a member function
iterator cast(const_iterator that);
This is perfectly const-correct because one needs to have a non-const
reference to the container to do this. In addition, the container is the
only piece of code that has the required knowledge to do this
conversion, so this must be the place for the function.
What do you think?
+0
However, I'd propose a different solution:
Iterators are actually two things:
1. Position markers
2. Access handles
What should be done is to split those two. Then you have
struct position {...};
struct iterator: position {...};
struct const_iterator: position {...};
Now, every container has these two:
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
Further, it gets this one:
element_type& operator[](position);
element_type const& operator[](position) const;
Additionally, it should provide this one:
iterator make_iterator(position);
const_iterator make_iterator(position) const;
You now have one type (struct position) that references a position in the
container. You can use this type, similarly to an index with deque/vector,
to retrieve an object from the container. Further, you can use it to create
first-class iterators that also encapsulate access to them. Note that
since 'const_iterator' is a 'position', you can also pass it
to 'make_iterator()' to get an 'iterator', provided you have a non-const
reference to the container.
Uli
--
Sator Laser GmbH
Gesch?ftsf?hrer: Thorsten F?cking, Amtsgericht Hamburg HR B62 932
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]