Archived

This topic is now archived and is closed to further replies.

johan_swe

Iterate trough std::map

Recommended Posts

johan_swe    122
My program crashes when I iterate through a std::map. m_pTextureLoader is a pointer to an object that loads textures (the file names) from directories and stores them in a std::map. The key in the map is the directory of the loaded texture and the second, a std::vector, contains strings for every available texture in that directory. The texture loader has a function that returns a pointer to the texture map. When I iterate through the map, the program crashes when it reaches it++ (which is after the first directory).
typedef std::map<std::string, std::vector<std::string> >	TEXTUREFILENAMES;

m_pTextureFileNames = m_pTextureLoader->GetTextureFileNames();

//for each directory

for(TEXTUREFILENAMES::const_iterator it = m_pTextureFileNames->begin(); it != m_pTextureFileNames->end(); it++)
{
//for each texture

for(DWORD c = 0, d = 0; d < it->second.size(); c++, d++)
{
//Do something

}
}

Share this post


Link to post
Share on other sites
DrPizza    160
Make sure that "do something" does not erase the iterator or delete the map.


[edited by - DrPizza on January 6, 2004 4:10:22 PM]

Share this post


Link to post
Share on other sites
FxMazter    164
Hum, could it be that you have it++ ?
try having ++it instead or otherwise the first iterator might get wrong?

Not sure why... but try that?

Share this post


Link to post
Share on other sites
psykr    295
I think that the for loop might mess it up; on the last iteration, i.e. end-1, the condition is still fulfilled. But on the next step, it gets incremented, so on the last loop, you''re actually modifying a non-existent entry.

To simplify everything, I just use

while( it != m_pTextureFilesNames.end() ) {
// code
...
// next iteration
++it;
}

Share this post


Link to post
Share on other sites
Fruny    1658
quote:
Original post by psykr
I think that the for loop might mess it up; on the last iteration, i.e. end-1, the condition is still fulfilled. But on the next step, it gets incremented, so on the last loop, you''re actually modifying a non-existent entry.


The loop is correct.

Share this post


Link to post
Share on other sites