• 0

C++ (STL): remove specific object from list


Question

Hello,

I have learned that I can create a linked list of objects, like this:

list< MyClass* > = myList;

I also know that if it were a list of primitive types, such as a list<int>, I could remove a specific element by calling

remove(myList.begin(), myList.end(), 8);

which for instance would remove any element that is 8.

However let's say MyClass has an attribute name_. I have a list of objects of type MyClass, and I'd like to create a function that finds and removes the object that has that name.

Stub:

void remove(string &name) const

{

remove(myList.begin(), myList.end(), ???);

}

The thing is, if I supply the string &name as an argument to the remove algorithm, it will attempt to compare MyClass objects with strings, which doesn't make sense. What I'd like it to do is compare the name_ attribute of its MyClass objects with the string &name.

I thought of supplying a boolean function that would return element->name_ == name, but the function would need two arguments (list<MyClass*> element, string &name) and I don't think that would work.

As you see I'm stuck.

10 answers to this question

Recommended Posts

  • 0

The way I have done this (which is probably wrong as I taught it to myself) is to use a std::map.

This way you would do something like:

 std::map&lt; std::string name, MyClass* &gt; MyList;
MyList["ClassName"] = PtrToClass;
MyList.erase( the name of the class (the std::name), in this case "ClassName" );

Even if this is wrong hopefully someone can show me how to do it right.

  • 0

for a list:

std::list&lt;MyClass*&gt; MyList

a remove function could be like:

void remove(string &amp;name) const
{
  std::list&lt;MyClass*&gt;::iterator iter;
  for (iter = MyList.begin(); iter != MyList.end(); iter++)
  {
	if ((*iter)-&gt;name_.equalis(name))
	{
	  MyList.erase(iter);
	  break;
	}
  }
}

  • 0

Lant's suggestion is probably the correct one if changing the container is practical which would depend on the particular circumstances.

dev's suggestion is probably the easier (and by no means wrong) if you have to stick with list<>.

The more STL solution would be to use one of the supplied algorithms, in this case remove_if would seem appropriate. The link shows some sample code which uses 'compose1' and 'bind2nd' to construct the 'predicate' function. This is also the STL way of doing things, i.e. you are reusing generic components instead of writing lots of special case code.

If all this 'predicate' stuff is a bit confusing try a different approach. Give your class an overloaded equality operator with another class of the same type which only compares their name_ attribute. Then pass a dummy instance of such a class to remove with the name_ attribute set to the desired value to remove.

As you can gather there are really a load of approaches and this can make C++ seem overwhelming at first. Just remember no one way is necessarily the best. But usually the professionals prefer the solution which reuses existing generic code rather than the individual approach.

  • 0

Ok I'm starting to make some sense of out bind2nd and compose1. Really cool stuff.

Another important question I have about the STL: let's say I have a vector of pointers to dynamic objects, for example:

std::vector< MyClass* > myVector;

MyClass * object1 = new MyClass();

MyClass * object2 = new MyClass();

myVector.push_back(object1);

myVector.push_back(object2);

When I call myVector.clear(), the cplusplus reference says that it will call the destructors for each of the elements. The thing is, I'm not sure if I need to call delete for each of these pointers or not.

  • 0
  Eoin said:
dev's suggestion is probably the easier (and by no means wrong) if you have to stick with list<>.

i tend to go for more verbose code due to me favouring the C way of doing things over C++. Only times i use C++ parts is when i want a list of things and don't want to make my own linked list, or i need classes with subclasses. Most of the time i avoid the STL due it not liking threading very well (in my experience anyway)

  Dr_Asik said:
Ok I'm starting to make some sense of out bind2nd and compose1. Really cool stuff.

Another important question I have about the STL: let's say I have a vector of pointers to dynamic objects, for example:

std::vector< MyClass* > myVector;

MyClass * object1 = new MyClass();

MyClass * object2 = new MyClass();

myVector.push_back(object1);

myVector.push_back(object2);

When I call myVector.clear(), the cplusplus reference says that it will call the destructors for each of the elements. The thing is, I'm not sure if I need to call delete for each of these pointers or not.

afaik you will need to delete the objects, i wasn't aware that calling clear() would call the destructors of the objects but apparently it does (Y)

  • 0
  Dr_Asik said:
When I call myVector.clear(), the cplusplus reference says that it will call the destructors for each of the elements. The thing is, I'm not sure if I need to call delete for each of these pointers or not.

Yeah I think you still need to call delete. I'm pretty sure the destructors only get called for objects stored by value

std::vector< MyClass > myVector;

MyClass object1;

myVector.push_back(object1);

If you need to store them as pointers consider using a smart point like boost::shared_ptr<>.

  • 0

Hm I'm really puzzled at how I am supposed to deallocate memory when erasing specific elements from a list. I thought about using auto_ptr (I can't use boost now), but the cplusplus reference advises against this:

Warning: It is generally a bad idea to put auto_ptr objects inside C++ STL containers. C++ containers can do funny things with the data inside them, including frequent reallocation (when being copied, for instance). Since calling the destructor of an auto_ptr object will free up the memory associated with that object, any C++ container reallocation will cause any auto_ptr objects to become invalid.

http://www.cppreference.com/cppmisc/auto_ptr.html

So what should I do?

  • 0

Well you can still manually call delete whenever you remove a element from a container, but ideally you do want a smart pointer to do this automatically.

If Boost IS an option then use shared_ptr as I suggested or the pointer containers. Or if you have access to tr1 the tr1::shared_ptr is the boost::shared_ptr basicially.

Otherwise you could try finding another reference counted smart pointer. The problem is inside STL containers objects can get copied as the container grows so if you used auto_ptr then at times there could exist two auto_ptr's to the same object. You need to use a reference counted smart pointer in this case as it ensures the object is deleted only when there are no smart pointers left pointing to it.

I know Scott Meyers published a reference counted smart pointer. Haven't used it myself but I imagine it should work fine. Of course it's published in one of his books but maybe you can find a listing of the code if you look around his online articles. His site maintains a list.

Others surely exist out there too but ideally you should use the boost or tr1 shared_ptr if you can.

  • 0

Well, as I really have to stick to absolute basic stuff, the STL, and not use any sort of loops, I have developped a very heavy and unelegant solution. Basically I selectively copy the elements that must not be removed into a new container. But as the containers contain pointers to these elements, I have to really copy objects, a costly process. Then I call delete on every pointer of the old container, erase the container, and assign the new container to the old container. Then the new container is discarded.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • AMD Ryzen AM4 16-core 5900XT processor has never been priced cheaper by Sayan Sen While AMD's newest processor platform with DDR5 and PCIe 5.0 goodness is AM5, the preceding Socket AM4 continues to be a great option for gamers shopping on a lower budget. One of the most powerful AM4 desktop chips, the 16-core Ryzen 9 5900XT, is currently priced at the lowest ever at just $230 (purchase links down below). The Ryzen 7 5900XT is based on the Zen 3 architecture supports DDR4, PCIe Gen4, and offers very good performance in both gaming and productivity. While users may not expect the same level of gaming throughput or latency improvement as the 5800X3D, it is certainly possible that titles that utilize more than 16 threads will favor the 5900XT over the 5800X3D. And the 5900XT has plenty of L3 cache as well at 64 MB. So while not 3D stacked V-cache, it should still be a decent gaming chip. And all that cache as well as cores/threads will be excellent for non-gaming tasks of course. The CPU has a base clock of 3.3 GHz and boosts up to 4.8. It has a TDP of 105 watts so the available power envelope certainly helps with that. It can tolerate temperatures of up to 90 °C and there is no boxed cooler with it. So you need an aftermarket one, ideally a 280 mm or 360 mm AIO liquid cooler or an excellent air cooler. Also since this is a 16-core 105-watt chip, make sure to run it on an AM4 board that has good quality VRM and cooling with lots of power (ideally an X570 motherboard). Another consideration is that it does not have integrated graphics so you need a separate dedicated GPU for display out. Get the AMD Ryzen 9 5900XT at the links below: AMD Ryzen 9 5900XT - No Integrated Graphics Desktop CPU Processor - 100-100001581WOF: $229.99 (Amazon US) || : $279.00 (Newegg US + Corsair 32GB DDR4-3200 RAM) This Amazon deal is US-specific and not available in other regions unless specified. If you don't like it or want to look at more options, check out the Amazon US deals page here. Get Prime (SNAP), Prime Video, Audible Plus or Kindle / Music Unlimited. Free for 30 days. As an Amazon Associate, we earn from qualifying purchases.
    • OnlyOffice 9.0.0 by Razvan Serea OnlyOffice Desktop Editors is an open-source office suite distributed under AGPL v.3 that combines text, spreadsheet and presentation editors allowing to create, view and edit documents stored on your computer. The application does not require constant connection to the Internet and allows youto create, edit, save and export text, spreadsheet and presentation documents. It is fully compatible with Office Open XML formats: .docx, .xlsx, .pptx. One pack - five editors - multiple features Create, view and edit text documents, spreadsheets and presentations of any size and complexity. Work on documents of most popular formats: DOCX, ODT, XLSX, PDF, ODS, CSV, PPTX, ODP, etc. Deal with multiple files within one and the same window thanks to the tab-based user interface. Highest compatibility with Microsoft Office formats. Real-time collaboration within your favorite cloud Connect ONLYOFFICE Desktop Editors to the cloud platform of your choice: ONLYOFFICE, Nextcloud or ownCloud to collaborate on documents with your team – co-edit in real time, review, comment and interact using chat. Extending your editing capabilities Take the most of your editing with the collection of third-party plugins. Insert a YouTube video, add special symbols or a ClipArt object, automatically translate any word or sentence, highlight code, etc. Do even more! Create your own plugin using the API documentation and ready-to-use examples available on GitHub. OnlyOffice key features: View, edit, and collaborate on docs, sheets, slides Build fillable PDF forms and fill them in online Read and edit PDFs, export/import to/from PDF Convert docs to Markdown and HTML Turn your textbooks into e-books Generate texts with the AI helper OnlyOffice 9.0 changelog: New features All Editors Redesigned interface of the main application window Added new interface themes: Modern Light and Modern Dark Added saving of the last selected languages in spellcheck lists Added Arabic spellcheck dictionary used in sixteen dialects Added AI-powered macro generation from descriptions and VBA-to-JavaScript conversion Added the interface translation into Urdu (ur-PK, Urdu (Pakistan)) Added support for TextArt text settings inside chart labels Added support for drawing the Up/Down Bars chart elements Merged local and cloud template lists into a unified view The list of templates is now processed on the client side, not on the server The installed system languages are now displayed at the top of the text/document/dictionary list Added a contrast-reducing effect for control buttons in inactive windows Added the option to select a printer in the print preview menu The Print using the system dialog option has been added to the print preview menu The ability to configure format associations for modern Windows OS in the EXE package installation wizard has been unlocked Document Editor Added correct display of previews for paragraph numbers for RTL Improved positioning and settings of TextArt for RTL Improved drawing of borders and fill for paragraphs with RTL direction Enabled accurate cursor navigation with arrow keys based on the paragraph's text direction Added the ability to display numbers using Hindi digits Added a setting in the File menu for selecting the preferred font size: Western/Chinese for the Chinese interface language (Chinese (Simplified)) Added a Borders button to the Home toolbar to quickly set paragraph settings Added support for the MD format for reading Spreadsheet Editor Added support for displaying bidirectional text Added the ability to select external data from another spreadsheet Presentation Editor Added the ability to set the paragraph direction (Text Direction > RTL) on the toolbar and in the advanced settings Added the ability to view animations with text Added the "Preserve" option to the Slide Master context menu Forms Changed the appearance of the Signature and Image fields: the placeholder and signature icon are now always displayed Improved user experience when filling in the Signature and Image fields Added a new "type": "signature" for the Signature field, used in the process of filling out forms PDF Editor Added the ability to set RTL direction for text The Edit Text option is available in the Community Edition build Implemented a PDF form editor Added copying pages between PDF files Diagrams Release of the first version of the Diagram Viewer with the ability to open VSDX files for viewing Convert Added conversion of the XLSB format to the editor's internal format, allowing editing and saving in XLSX without preliminary conversion Download: OnlyOffice 64-bit | 273.0 MB (Open Source) Download: OnlyOffice 32-bit | 252.0 MB Download: Windows XP 64-bit | 467.0 MB Download: Windows XP 32-bit | 457.0 MB View: OnlyOffice Website | Screenshot | Release Notes Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • Awesome! Can't wait to get the stable version on my Surface Pro.
    • Welcome to our cozy corner of the internet!
    • XnView Shell Extension 4.2.0 by Razvan Serea XnView Shell Extension is a powerful Windows Explorer add-on that enhances file management by providing quick image previews, thumbnails, and context menu tools without launching XnView. It supports over 500 image formats including RAW (CR2/NEF), WebP, HEIC, TIFF, and vector formats (PSD/SVG), allowing users to resize, convert, edit, and optimize images directly from the right-click menu. The lightweight integration streamlines workflows, enabling batch processing, metadata viewing (EXIF/IPTC), and seamless format conversion—ideal for photographers, designers, and casual users who need efficient file handling. Beyond basic previews, the extension offers advanced features like image rotation, format adjustments, and plugin support. Its intuitive interface ensures fast access to editing tools while maintaining system performance. XnView Shell Extension key features: 500+ Format Support – Opens and converts RAW, WebP, HEIC, TIFF, PSD, SVG, and more Batch Processing – Convert, resize, or rename multiple images at once Lossless JPEG Editing – Rotate, flip, and adjust without quality loss Metadata Preservation – Retains EXIF, IPTC, and XMP data during conversions Advanced Compression – Customize JPEG quality, PNG optimization, and WEBP settings Color Management – Handles ICC profiles, bit-depth (8/16/32-bit), and CMYK-to-RGB conversion PDF & GIF Support – Extract images from PDFs or create animated GIFs High-Speed Previews – Fast thumbnails and image previews in Windows Explorer Right-Click Actions – Quick access to resize, rotate, and convert without opening apps Plugin Extensibility – Add support for niche formats like DDS, HDR, or DICOM Download: XnShell 64-bit | Portable 64-bit | ~10.0 MB (Freeware) Download: XnShell 32-bit | Portable 32-bit | ~3.0 MB Links: XnView Shell Extension Home Page | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
  • Recent Achievements

    • Week One Done
      Wayne Robinson earned a badge
      Week One Done
    • One Month Later
      Karan Khanna earned a badge
      One Month Later
    • Week One Done
      Karan Khanna earned a badge
      Week One Done
    • First Post
      MikeK13 earned a badge
      First Post
    • Week One Done
      OHI Accounting earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      687
    2. 2
      ATLien_0
      265
    3. 3
      Michael Scrip
      204
    4. 4
      +FloatingFatMan
      171
    5. 5
      Steven P.
      145
  • Tell a friend

    Love Neowin? Tell a friend!