R
Rune Allnor
(Sorry if this question appears in two posts)
I have a list of size_t objects, the numbers 0, 1 and 2,
that are referenced by three ..::reverse_iterators. When I
erase the middle iterator, the item referenced by the argument
to list.erase() remains, while some other item has been deleted.
As far as I can see, this behaviour is not correct. The screen
dump below explains what was actually done, and compare it
to what I naively would expect to see. I also ran a similar test
with std::list<>::iterator types, and in that case the outcome
was as expected. So there is something weird about the
reverse_iterators.
Any opinions about what the cause might be?
I'm using VS2008.
Rune
/*****************************************************************/
Reverse iterator 'start' refers to value 0 - expected value 0.
Reverse iterator 'middle' refers to value 1 - expected value 1.
Reverse iterator 'tail' refers to value 2 - expected value 2.
Value referenced by reverse iterator 'middle' has been erased
Reverse iterator 'start' refers to value 0 - expected value 0.
Reverse iterator 'tail' refers to value 1 - expected value 2.
1st item in list: 0 - expected value 0.
2nd item in list: 1 - expected value 2.
/*****************************************************************/
#include <list>
#include <iostream>
int main()
{
std::list<size_t> list;
for (int n=0;n<3;++n)
list.push_back(n);
std::list<size_t>::reverse_iterator start = list.rbegin();
std::list<size_t>::reverse_iterator tail = start++;
std::list<size_t>::reverse_iterator middle = start++;
std::cout << "Reverse iterator 'start' refers to value " << *start
<< " - expected value 0."<< std::endl;
std::cout << "Reverse iterator 'middle' refers to value " << *middle
<< " - expected value 1."<< std::endl;
std::cout << "Reverse iterator 'tail' refers to value " << *tail
<< " - expected value 2."<< std::endl;
// Erase middle item from list.
list.erase(middle.base());
std::cout << std::endl;
std::cout << "Value referenced by reverse iterator 'middle' has been
erased" << std::endl;
std::cout << "Reverse iterator 'start' refers to value " << *start
<< " - expected value 0." << std::endl;
std::cout << "Reverse iterator 'tail' refers to value " << *tail
<< " - expected value 2." << std::endl;
std::cout << std::endl;
std::list<size_t>::iterator i = list.begin();
std::cout << "1st item in list: " << *i
<< " - expected value 0." << std::endl;
++i;
std::cout << "2nd item in list: " << *i
<< " - expected value 2." << std::endl;
return 0;
}
I have a list of size_t objects, the numbers 0, 1 and 2,
that are referenced by three ..::reverse_iterators. When I
erase the middle iterator, the item referenced by the argument
to list.erase() remains, while some other item has been deleted.
As far as I can see, this behaviour is not correct. The screen
dump below explains what was actually done, and compare it
to what I naively would expect to see. I also ran a similar test
with std::list<>::iterator types, and in that case the outcome
was as expected. So there is something weird about the
reverse_iterators.
Any opinions about what the cause might be?
I'm using VS2008.
Rune
/*****************************************************************/
Reverse iterator 'start' refers to value 0 - expected value 0.
Reverse iterator 'middle' refers to value 1 - expected value 1.
Reverse iterator 'tail' refers to value 2 - expected value 2.
Value referenced by reverse iterator 'middle' has been erased
Reverse iterator 'start' refers to value 0 - expected value 0.
Reverse iterator 'tail' refers to value 1 - expected value 2.
1st item in list: 0 - expected value 0.
2nd item in list: 1 - expected value 2.
/*****************************************************************/
#include <list>
#include <iostream>
int main()
{
std::list<size_t> list;
for (int n=0;n<3;++n)
list.push_back(n);
std::list<size_t>::reverse_iterator start = list.rbegin();
std::list<size_t>::reverse_iterator tail = start++;
std::list<size_t>::reverse_iterator middle = start++;
std::cout << "Reverse iterator 'start' refers to value " << *start
<< " - expected value 0."<< std::endl;
std::cout << "Reverse iterator 'middle' refers to value " << *middle
<< " - expected value 1."<< std::endl;
std::cout << "Reverse iterator 'tail' refers to value " << *tail
<< " - expected value 2."<< std::endl;
// Erase middle item from list.
list.erase(middle.base());
std::cout << std::endl;
std::cout << "Value referenced by reverse iterator 'middle' has been
erased" << std::endl;
std::cout << "Reverse iterator 'start' refers to value " << *start
<< " - expected value 0." << std::endl;
std::cout << "Reverse iterator 'tail' refers to value " << *tail
<< " - expected value 2." << std::endl;
std::cout << std::endl;
std::list<size_t>::iterator i = list.begin();
std::cout << "1st item in list: " << *i
<< " - expected value 0." << std::endl;
++i;
std::cout << "2nd item in list: " << *i
<< " - expected value 2." << std::endl;
return 0;
}