for_each und vector<pointer> initialisierung



  • Hallo,

    ich möchte einen Vektor einer bestimmten größe mit pointern initialisieren. Am besten als EInzeiler. Bisher sieht es so aus:

    std::vector<blub::Ptr> a;
    	a.resize( anzahl );
    	for_each( a.begin() , a.end() , blub::Ptr( new blub() ) );
    

    Allerdings sind es drei Zeilen und alle Elemente Zeigen auf dasselbe Objekt. Lässt sich das irgendwie umgehen, ohne eine normale For-Schleife bilden zu müssen?
    Danke



  • std::vector<blub::Ptr> a( anzahl, blub::Ptr(new blub()) );
    

    Meinst du das?



  • out schrieb:

    std::vector<blub::Ptr> a( anzahl, blub::Ptr(new blub()) );
    

    Meinst du das?

    blublablub schrieb:

    [...]Allerdings sind es drei Zeilen und alle Elemente Zeigen auf dasselbe Objekt.[...]



  • out schrieb:

    ...
    

    Meinst du das?

    Theoretisch ja, es handelt sich aber immer noch um dieselben Objekte.



  • Dafür gibt es generate.



  • TyRoXx schrieb:

    Dafür gibt es generate.

    Danke,
    sieht in jedem Fall interessant aus, habe aber die Syntax nicht hinbekommen. Wie soll ich das mit dem new und dem Standardkonstruktor dieser Klasse formulieren?



  • blublablub schrieb:

    sieht in jedem Fall interessant aus, habe aber die Syntax nicht hinbekommen. Wie soll ich das mit dem new und dem Standardkonstruktor dieser Klasse formulieren?

    Ich glaube kaum das dies mit dem Standardkonstruktor geht, ein Zweizeiler dürfte vermutlich (selbst noch nie verwendet) Etwa wie folgt aussehen:

    std::vector<blub::Ptr> a(anzahl);
    std::generate(a.begin(), a.end(), blub::Ptr(new blub()));
    


  • #include <vector>
    #include <algorithm>
    #include <memory>
    
    namespace
    {
    	struct blub
    	{
    		typedef std::unique_ptr<blub> Ptr;
    	};
    
    	blub::Ptr create_blub()
    	{
    		return blub::Ptr(new blub);
    	}
    }
    
    int main()
    {
    	std::vector<blub::Ptr> a(123);
    	std::generate(a.begin(), a.end(), create_blub);
    
    	//oder mit Lambda-Funktion aus C++11
    	std::generate(a.begin(), a.end(),
    		[](){ return blub::Ptr(new blub); });
    
    	//mit begin/end wie in C++11 üblich
    	{
    		using namespace std;
    		std::generate(begin(a), end(a),
    			[](){ return blub::Ptr(new blub); });
    	}
    }
    

Anmelden zum Antworten