Deep Copy von Vectoren



  • Hi

    wie code ich am elegantesten eine DeepCopy eines std::vector welcher Zeiger auf andere Objekte beinhaltet. Diese sollen dabei mitkopiert werden.

    also sowas wie

    typedef std::vector< klasse* > PKLASSEVEC;
    PKLASSEVEC veca;
    ...//veca mit irgendwas füllen
    PKLASSEVEC *vecb = new PKLASSEVEC(  veca.begin(), veca. end() );
    

    reicht ja nicht, weil ich die Objekte nicht mitkopiere sondern nur den zeiger. Jemand eine elegante Idee?
    Betonung liegt auf elegant. Eine Schleife basteln und dann immer den Zuweisungsoperator oder den Kopierkonstruktor aufrufen ist ja nichts besonderes..

    Danke euch.
    Gruß



  • class K
    {
    public:
    	K(int i)
    		:	m_i(i)
    	{
    		std::cout << "K constructed with i = " << i << std::endl;
    	}
    
    	K(K const& other)
    		:	m_i(other.m_i)
    	{
    		std::cout << "K copy-constructed with i = " << other.m_i << std::endl;
    	}
    
    private:
    	int const m_i;
    };
    
    template<class T> T* mighty_cloner(T const* t)
    {
    	return new T(*t);
    }
    
    template<class T> void mighty_deleter(T* t)
    {
    	delete t;
    }
    
    void foo()
    {
    	std::vector<K*> v1;
    	v1.push_back(new K(1));
    	v1.push_back(new K(2));
    	v1.push_back(new K(42));
    
    	std::vector<K*> v2;
    	std::transform(v1.begin(), v1.end(), std::back_inserter(v2), mighty_cloner<K>);
    
    	std::for_each(v1.begin(), v1.end(), mighty_deleter<K>);
    	v1.clear();
    
    	std::for_each(v2.begin(), v2.end(), mighty_deleter<K>);
    	v2.clear();
    }
    

    Elegant genug? BTW: nimm smart pointer wenn du die in Container reinstecken willst. Ist einfacher und sicherer.



  • genau sowas hab ich gesucht.
    danke dir.

    gibts eigentlich von boost oder ggf. der stl nicht schon sowas wie nen cloner?



  • Nein, aber SmartPointer (und die sind hier imho angebrachter). Damit sparst du dir z.B. die for_each Sachen, die ja eigentlich sowieso in den (Kon|De)struktor gehören.



  • .filmor schrieb:

    Nein, aber SmartPointer (und die sind hier imho angebrachter). Damit sparst du dir z.B. die for_each Sachen, die ja eigentlich sowieso in den (Kon|De)struktor gehören.

    Doch 🙂 gibts:http://www.boost.org/libs/ptr_container/doc/reference.html
    Macht genau das was Dein Code macht
    http://www.boost.org/libs/ptr_container/doc/reference.html#the-clonable-concept



  • sorry, aber das check ich mal morgen ohne alk im blut.. 🙂


Anmelden zum Antworten