Iterator Confusion

This is a discussion on Iterator Confusion within the C++ Programming forums, part of the General Programming Boards category; I'm sure once I see the solution to this problem I'll be banging my head on the desk but anyway, ...

  1. #1
    Professional Chef leeor_net's Avatar
    Join Date
    Apr 2004
    Location
    Charles Town, WV
    Posts
    147

    Iterator Confusion

    I'm sure once I see the solution to this problem I'll be banging my head on the desk but anyway, here goes.

    I created a std::map that I'm iterating through checking for a value. If the value matches, I delete the entry in map and continue on until I reach the end of the list.

    The problem I'm having is when I try to delete the last element in the map. It would make sense that there are no further elements after deleting it. A this point the program backs out with a debug error.

    I thought to add a check, if(it = map.end()) but I'm getting " conditional expression of type 'std::_Tree<_Traits>::iterator' is illegal" error. So clearly I'm using it incorrectly.

    Here's the block of code that I'm using. The only real relevant part is the for() loop iterating through mTextureArray which is a std::map:

    Code:
    for(map<Image*, pair<GLuint, int> >::iterator i  ; i != mTextureArray.end(); i++)
    {
    	if((currentTick - i->second.second) > TEXTURE_EXPIRE_TIME)
    	{
    		glDeleteTextures(1, &i->second.first);
    		mTextureArray.erase(i);
    	}
    }
    - Leeor

  2. #2
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    22,303
    Quote Originally Posted by leeor_net
    I created a std::map that I'm iterating through checking for a value. If the value matches, I delete the entry in map and continue on until I reach the end of the list.
    Are you sure that a std::map is the correct container for this? Anyway, what you to do is this:
    Code:
    map<Image*, pair<GLuint, int> >::iterator i = mTextureArray.begin();
    while(i != mTextureArray.end())
    {
        if((currentTick - i->second.second) > TEXTURE_EXPIRE_TIME)
        {
            glDeleteTextures(1, &i->second.first);
            mTextureArray.erase(i++);
        }
        else
        {
            ++i;
        }
    }
    C + C++ Compiler: MinGW port of GCC
    Version Control System: Bazaar

    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  3. #3
    Professional Chef leeor_net's Avatar
    Join Date
    Apr 2004
    Location
    Charles Town, WV
    Posts
    147
    Quote Originally Posted by laserlight View Post
    Are you sure that a std::map is the correct container for this?
    No, not really. I asked about it yesterday and somebody suggested I use a std:: pair<>. The comparisons work but I don't know if there's a better solution.

    This now works as I expect it to. Now I'm interested in why it works like this so I can have a better understanding of how to properly use iterators.

    Thanks for the tip. I always appreciate your help!
    - Leeor

  4. #4
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    22,303
    Quote Originally Posted by leeor_net
    This now works as I expect it to. Now I'm interested in why it works like this so I can have a better understanding of how to properly use iterators.
    When an element is erased from a std::map, iterators that refer to it are invalidated. Therefore we should advance the iterator before using it to erase the element, and post-increment works just right to do that.
    C + C++ Compiler: MinGW port of GCC
    Version Control System: Bazaar

    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  5. #5
    Professional Chef leeor_net's Avatar
    Join Date
    Apr 2004
    Location
    Charles Town, WV
    Posts
    147
    Ah, I understand now. That makes perfect sense. I knew a bit about invalidating iterators but never thought I had come across it.

    Thank you!
    - Leeor

Popular pages Recent additions subscribe to a feed

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21