std::vector Frage



  • In meinem Code gibt es eine Klasse, die mit einem Integer im Konstruktor initialisiert werden muss.

    Nun benötige ich eine größere Menge von Objekten dieser Klasse mit aufsteigender Zahl, die ich gerne in einem vector speichern möchte.

    Wie lege ich die am besten an?

    class Example
    {
    private:
      int id;
    public:
      Example(int i): id(i);
    };
    
    // Hätte gerne 100 mit den Ids 0 - 99
    std::vector<Example> examples(100);
    

    Wichtig wäre mir dabei auch, dass keine temporären Objekte erzeugt/zerstört werden, da der Destruktor der Klasse Seiteneffekte enthält.



  • heartless schrieb:

    da der Destruktor der Klasse Seiteneffekte enthält.

    Das ist eine blöde Idee.

    Ansonsten: reserve(100) und dann mit einer Schleife 100 mal emplace_back.



  • Mit std::iota .

    Edit:
    Sehe grad, dass deine Klasse dann den ++operator implementieren muss. Ne stumpfe for-Schleife ist dann wohl doch besser.


  • Mod

    DocShoe schrieb:

    Mit std::iota .

    Edit:
    Sehe grad, dass deine Klasse dann den ++operator implementieren muss.

    Du hast eher versäumt zu sehen, dass der TE den Konstruktor (aus Unwissenheit?) nicht als explicit deklariert hat:

    #include <iterator>
    #include <numeric>
    int main() {
        Example e[10];
        std::iota(std::begin(e), std::end(e), 0);
    }
    


  • Arcoth schrieb:

    DocShoe schrieb:

    Mit std::iota .

    Edit:
    Sehe grad, dass deine Klasse dann den ++operator implementieren muss.

    Du hast eher versäumt zu sehen, dass der TE den Konstruktor (aus Unwissenheit?) nicht als explicit deklariert hat:

    #include <iterator>
    #include <numeric>
    int main() {
        Example e[10];
        std::iota(std::begin(e), std::end(e), 0);
    }
    

    kompiliert nicht.
    https://ideone.com/AFdvzG
    zu mindestens nicht mit C++14


  • Mod

    Hast Du die Fehlermeldung gelesen?


  • Mod

    Arcoth schrieb:

    Hast Du die Fehlermeldung gelesen?

    Kommt dir die Frage nicht berechtigt vor? Das Problem ist schließlich nicht zu beheben, ohne entweder die Eigenschaften der Klasse erheblich zu ändern, oder dein Beispiel erheblich abzuändern.


  • Mod

    SeppJ schrieb:

    Arcoth schrieb:

    Hast Du die Fehlermeldung gelesen?

    Kommt dir die Frage nicht berechtigt vor? Das Problem ist schließlich nicht zu beheben, ohne entweder die Eigenschaften der Klasse erheblich zu ändern

    Wirklich? Ein Default Argument für den Konstruktor hältst du für eine erhebliche Änderung?

    class Example
    {
    private:
      int id;
    public:
      Example(int i = 0): id(i);
    };
    

    Ich bin überzeugt, dass firefly sich nicht einmal die Mühe gemacht hat, die 10 Sekunden zu investieren, die es braucht, um diese Fehlermeldung zu beheben.

    Es gibt Grenzen, Seppl. Grenzen.


  • Mod

    Arcoth schrieb:

    SeppJ schrieb:

    Arcoth schrieb:

    Hast Du die Fehlermeldung gelesen?

    Kommt dir die Frage nicht berechtigt vor? Das Problem ist schließlich nicht zu beheben, ohne entweder die Eigenschaften der Klasse erheblich zu ändern

    Wirklich? Ein Default Argument für den Konstruktor hältst du für eine erhebliche Änderung?

    Ja? Dir nicht? Du weißt überhaupt nichts über die Bedeutung des Arguments. Was ist, wenn das etwas essentielles für die Identität der Klasse ist? Besonders, da schon gesagt wurde, dass temporäre Objekte vermieden werden sollen, da der Konstruktor Nebeneffekte hat.

    Könnten zum Beispiel TCP-Verbindungen über Ports 8001-8100 sein, da wäre es fatel, einfach ein Default 0 einzuführen und das als kleine Änderung abzutun.

    Es gibt Grenzen, Seppl. Grenzen.

    Das ist nicht mein Name.



  • Arcoth schrieb:

    Wirklich? Ein Default Argument für den Konstruktor hältst du für eine erhebliche Änderung?

    heartless schrieb:

    da der Destruktor der Klasse Seiteneffekte enthält.

    Hört sich so an.


  • Mod

    Ihr habt wohl nicht erfasst, dass es sich hier um ein Pseudo- Example innerhalb von Pseudocode handelt, dass lediglich meiner Demonstration von iota dient. Es ist doch ersichtlich, dass die nötige Änderung meinem Einsatz eines Arrays statt des vector s geschuldet ist, und nicht dem Einsatz von iota selbst. Ich habe doch nie behauptet, dass mein Code mehr als Pseudo-Code ist, dessen einzige bedeutungsvolle Zeile der iota -Aufruf ist. Und genauso fordere ich firefly auf, das Beispiel selbst auf die im Eingangspost gegebene Definition von Example zu übertragen. Soll ich hier jeden trivialen Quatsch vorkauen, damit copy&paste ausreicht?

    SeppJ schrieb:

    Es gibt Grenzen, Seppl. Grenzen.

    Das ist nicht mein Name.

    Soll ich Dich beim Klarnamen nennen, oder fändest Du das schon dreist? Was für eine Sorte von Forenmitglied nimmt einem ein harmloses Wortspiel mit deren moniker übel?



  • @Arcoth
    Sei mal nicht so eingeschnappt. Wortspiele mit dem Namen nimmt man schnell mal übel, speziell wenn man in einer Diskussion diametrale Positionen hat.


  • Mod

    hustbaer schrieb:

    @Arcoth
    Sei mal nicht so eingeschnappt. Wortspiele mit dem Namen nimmt man schnell mal übel, speziell wenn man in einer Diskussion diametrale Positionen hat.

    Man sollte aber sein Unbehagen auf eine Weise ausdrücken, die mich nicht entfremdet. Hab's doch nicht so gemeint. 😞



  • @ heartless
    Die einfachste Lösung wäre wohl einen std::vector<std::unique_ptr<Foo>> statt eines std::vector<Foo> zu verwenden. Damit kontrollierst du explizit wann ein Objekt erzeugt bzw. zerstört wird, der std::vector funkt dir in keiner Weise dazwischen.



  • Arcoth schrieb:

    Ihr habt wohl nicht erfasst, dass es sich hier um ein Pseudo- Example innerhalb von Pseudocode handelt, dass lediglich meiner Demonstration von iota dient. Es ist doch ersichtlich, dass die nötige Änderung meinem Einsatz eines Arrays statt des vector s geschuldet ist, und nicht dem Einsatz von iota selbst. Ich habe doch nie behauptet, dass mein Code mehr als Pseudo-Code ist, dessen einzige bedeutungsvolle Zeile der iota -Aufruf ist. Und genauso fordere ich firefly auf, das Beispiel selbst auf die im Eingangspost gegebene Definition von Example zu übertragen. Soll ich hier jeden trivialen Quatsch vorkauen, damit copy&paste ausreicht?

    Ich habe die Example class definiton aus dem eigangspost genommen und da ist keinerlei default argument gegeben für den parameter im konstruktor.
    Oder was meinst du sonst?


  • Mod

    firefly schrieb:

    Arcoth schrieb:

    Ihr habt wohl nicht erfasst, dass es sich hier um ein Pseudo- Example innerhalb von Pseudocode handelt, dass lediglich meiner Demonstration von iota dient. Es ist doch ersichtlich, dass die nötige Änderung meinem Einsatz eines Arrays statt des vector s geschuldet ist, und nicht dem Einsatz von iota selbst. Ich habe doch nie behauptet, dass mein Code mehr als Pseudo-Code ist, dessen einzige bedeutungsvolle Zeile der iota -Aufruf ist. Und genauso fordere ich firefly auf, das Beispiel selbst auf die im Eingangspost gegebene Definition von Example zu übertragen. Soll ich hier jeden trivialen Quatsch vorkauen, damit copy&paste ausreicht?

    Ich habe die Example class definiton aus dem eigangspost genommen und da ist keinerlei default argument gegeben für den parameter im konstruktor.
    Oder was meinst du sonst?

    Natürlich ist da keiner. Das soll auch so bleiben. In meiner Demonstration habe ich einfach flüchtig ein Array statt einem vector genommen, was einen Default-Konstruktor benötigt. Das ändert aber nichts an der Anwendbarkeit von iota . Und Du hättest das Problem auch sofort erkannt, wenn Du die Fehlermeldung gelesen hättest, womit sich deine Frage erübrigt hätte. Nichts für Ungut, aber ich hab einfach nichts für solche unüberlegten Kommentare übrig.



  • Arcoth schrieb:

    In meiner Demonstration habe ich einfach flüchtig ein Array statt einem vector genommen, was einen Default-Konstruktor benötig.

    Und mit einem vector würde es ohne Defaultkonstruktor funktionieren?


  • Mod

    manni66 schrieb:

    Arcoth schrieb:

    In meiner Demonstration habe ich einfach flüchtig ein Array statt einem vector genommen, was einen Default-Konstruktor benötig.

    Und mit einem vector würde es ohne Defaultkonstruktor funktionieren?

    😕

    std::vector<Example> vec(0, 10);
    std::iota(std::begin(e), std::end(e), 0);
    

  • Mod

    Arcoth schrieb:

    manni66 schrieb:

    Arcoth schrieb:

    In meiner Demonstration habe ich einfach flüchtig ein Array statt einem vector genommen, was einen Default-Konstruktor benötig.

    Und mit einem vector würde es ohne Defaultkonstruktor funktionieren?

    😕

    std::vector<Example> vec(0, 10);
    std::iota(std::begin(e), std::end(e), 0);
    

    😕
    Sprich: Nein, es würde nicht funktionieren? Ob du nun implizit ein Array mit 0 initialisierst oder einen Vector explizit mit 0, macht doch dein Beispiel nicht besser. In jedem Fall legst du unnötige, und ausdrücklich nicht gewünschte Defaultobjekte an, bevor du die korrekten Objekte erzeugst.

    Ich bin sehr verwirrt: Wer bist du und was hast du mit dem echten Arcoth gemacht?



  • SeppJ schrieb:

    Arcoth schrieb:

    manni66 schrieb:

    Arcoth schrieb:

    In meiner Demonstration habe ich einfach flüchtig ein Array statt einem vector genommen, was einen Default-Konstruktor benötig.

    Und mit einem vector würde es ohne Defaultkonstruktor funktionieren?

    😕

    std::vector<Example> vec(0, 10);
    std::iota(std::begin(e), std::end(e), 0);
    

    😕
    Sprich: Nein, es würde nicht funktionieren? Ob du nun implizit ein Array mit 0 initialisierst oder einen Vector explizit mit 0, macht doch dein Beispiel nicht besser. In jedem Fall legst du unnötige, und ausdrücklich nicht gewünschte Defaultobjekte an, bevor du die korrekten Objekte erzeugst.

    Ich stimme prinzipiell zu, allerdings hat der OP klargemacht, dass er solche Objekte wegen ihres Destruktors vermeiden möchte - ein Destruktor wird hier aber so wie ich das sehe nirgends aufgerufen, wodurch Arcoth's Lösung technisch gesehen schon den Anforderungen genügen würde.

    SeppJ schrieb:

    Ich bin sehr verwirrt: Wer bist du und was hast du mit dem echten Arcoth gemacht?

    Was die Pubertät so mit den Menschen macht... *duckundweg*


Anmelden zum Antworten