Re: [ROOT] TObjArray::Remove

From: Fons Rademakers (Fons.Rademakers@cern.ch)
Date: Mon Oct 13 2003 - 19:01:05 MEST


Hi Gero,

 I'll make the comments more explicit.

To remove all occurrences of the same object call
TCollection::RecursiveRemove().

Cheers, Fons.


On Mon, 2003-10-13 at 16:28, Gero Flucke wrote:
> Hi Rooters!
> I wonder about the behaviour of TObjArray::Remove(TObject* obj):
> 
> 1.
> As it uses TObjArray::IndexOf(obj) it does not remove objects with address
> equal to obj, but the first object that answers kTRUE on IsEqual(obj). But
> this is what I expect from a method 'Remove' with a pointer as argument.
> At least the html documentation should mention that!
> A macro showing the removal of the - for my expectation - wrong object
> canbe found at the end.
> 
> 
> 2.
> One may also expect that all objects equal to 'obj' are removed from the
> array, not only  the first that matches. Here I admit that this is a
> matter of taste, but at least it should be documented in html.
> 
> Cheers
> 
> 	Gero Flucke
> 
> PS: (ROOT 3.04_02 on desy-linux4 (suse based))
> 
> PSS: Here comes the macro
> 
> 
> 
> #include "TNamed.h"
> #include "TObjArray.h"
> #include <iostream>
> 
> class MyNamed : public TNamed{
> public:
>   MyNamed(const char* name) : TNamed(name, name){}
>   virtual Bool_t IsEqual(const TObject* obj) const{
>     return (obj && fName == TString(obj->GetName()));
>   }
>   virtual void Print(Option_t* opt) const{
>     this->TNamed::Print();
>     cout << this << endl;
>   }
>   ClassDef(MyNamed,1)
> };
> 
> void macro()
> {
>   MyNamed* mn1 = new MyNamed("nam1");
>   cout << mn1 << endl;
>   MyNamed* mn2 = new MyNamed("nam2");
>   cout << mn2 << endl;
>   MyNamed* mn3 = new MyNamed("nam1"); // again name as mn1
>   cout << mn3 << endl;
> 
>   TObjArray* arr = new TObjArray;
>   arr->Add(mn3);
>   arr->Add(mn1);
>   arr->Add(mn2);
>   arr->Print();
> 
>   cout << "\n Now removing " << mn1 << "..." << endl;
> 
>   arr->Remove(mn1);
>   arr->Print();
> 
> }
> 
> giving :
> 
> root [0] .x macro.C++
> Info in <TUnixSystem::ACLiC>: creating shared library
> /afs/desy.de/user/f/flucke/h1/oo/calib/GFCalib/./macro_C.so
> 0x88d4868
> 0x88d6370
> 0x88d63c0
> OBJ: MyNamed    nam1    nam1
> 0x88d63c0
> OBJ: MyNamed    nam1    nam1
> 0x88d4868
> OBJ: MyNamed    nam2    nam2
> 0x88d6370
> 
>  Now removing 0x88d4868...
> OBJ: MyNamed    nam1    nam1
> 0x88d4868
> OBJ: MyNamed    nam2    nam2
> 0x88d6370
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> -----------------------------------------------------------------------
> Gero Flucke
> 1a / 603
> DESY
> Notkestr. 85
> 22607 Hamburg
> +49-(0)40-8998-2454
-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://www.rademakers.org/fons/      Fax:   +41 22 7679480



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:16 MET