While I use iterator like this ,
//include header files
using namespace std;
int main()
{
map<int,int> intIntMap;
map<int,int>::iterator pos;
pos = intIntMap.begin();
intIntMap[0] = 1;
intIntMap[3] = 5;
intIntMap[4] = 9;
intIntMap[5] = 5;
//遍历
cout << (*pos).first << endl;
while( pos != intIntMap.end() )
{
cout << pos->first << " <---> " << pos->second << endl;
pos++;
}
}
The output is 4;
But while I use iterator like this:
//include header file
using namespace std;
int main()
{
map<int,int> intIntMap;
map<int,int>::iterator pos;
intIntMap[0] = 1;
intIntMap[3] = 5;
intIntMap[4] = 9;
intIntMap[5] = 5;
//遍历
pos = intIntMap.begin();
cout << (*pos).first << endl;
while( pos != intIntMap.end() )
{
cout << pos->first << " <---> " << pos->second << endl;
pos++;
}
}
The output is what I want;
I want to know what is the difference between use of iterator, what happended to the first iterator when I insert new key-value pair ? Thanks!
addtion: compile is use gcc 4.1.2 , in feel more confused,like this :
Since you called begin()
when the container was empty, you got an iterator that was equal to end()
(§23.1/7: "If the container is empty, then begin() == end()").
Inserting items into the container didn't change that, so you still have pos == intIntMap.end()
.
You then execute zero iterations of your loop, since pos==end()
, and you'r executing the loop only as long as pos != end()
.
In the second example, you set pos()
after you've inserted the data, so you get the first items in the collection, and iterate to the last.
Edit: As far as printing out the contents of the map goes, I'd probably do it more like this:
std::ostream &operator<<(std::ostream &os, std::pair<int, int> const &d) {
return os << d.first << " <---> " << d.second;
}
// ...
std::copy(intIntMap.begin(), intIntMap.end(),
std::ostream_iterator<std::pair<int, int> >(std::cout, "\n"));
Going through this with gdb, I found that the first
field of the iterator was changing with each addition of a key-value pair. It seems that an iterator to a map with no data in it (returned by begin()
) contains some metadata about the map itself, specifically the size of the map (the first
field of said iterator grew with each addition of a key-value pair). Calling begin()
to retrieve the iterator after a single key-value pair is added results in the "expected" behavior.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With