Solved

c++; map interator; detecting when a find() returns an invalid iterator

Posted on 2008-10-14
4
1,079 Views
Last Modified: 2012-05-05
I've got a map<string,string> as part of a class and am writing a function to delete one of the map items, based on the key name. Once I obtain the iterator - through a find() - I tell it to erase it from the map.  Works great if it finds a match.  If it doesn't find a match, VS2005 pops up an errors "debug assertion failed!".  

I've looked online and cannot find anything which dictates how to test an iterator for a NULL/invalid value.  I finally discovered a solution which IMHO seems rather clunky... but it does the job.

if(iter._Ptr->_Isnil) { return; } //  exit method if invalid iterator

I find it difficult to believe this is the proper way to test for an invalid iterator.  Is there a better way?  The full 'delete' method is listed below.

Oh and I suppose I should mention, this is a cross-platform app, so g++ 4.1.2 will also need to be able to compile it.
void deleteItem(string key) {
    map<string,string>::iterator i = this->_Items->find(key);
    if(i._Ptr->_Isnil) { return; }
    this->_Items->erase(i);
  }

Open in new window

0
Comment
Question by:BaconU
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
4 Comments
 
LVL 19

Accepted Solution

by:
LordOfPorts earned 75 total points
ID: 22713200
If find does not detect value it should return map::end http://www.cplusplus.com/reference/stl/map/find.html
0
 
LVL 3

Expert Comment

by:wktang83
ID: 22713289

void deleteItem(string key) {
    map<string,string>::iterator i = this->_Items->find(key);
    if(i._Ptr == this->_Items->end()) { return; }
    this->_Items->erase(i);
  }

Open in new window

0
 

Author Closing Comment

by:BaconU
ID: 31505968
Ah, yes... I should have known.  I mistakenly assumed that the end() was only to be used in conjunction with begin().  

This is a much nicer solution!  Thanks LordOfPorts!
0
 

Author Comment

by:BaconU
ID: 22713868
wktang83, according to my tests, you don't need the ._Ptr when testing again end().
0

Featured Post

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Often, when implementing a feature, you won't know how certain events should be handled at the point where they occur and you'd rather defer to the user of your function or class. For example, a XML parser will extract a tag from the source code, wh…
Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

710 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question