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.
-
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
-
Hast Du die Fehlermeldung gelesen?
-
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.
-
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.
-
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.
-
Ihr habt wohl nicht erfasst, dass es sich hier um ein Pseudo-
Example
innerhalb von Pseudocode handelt, dass lediglich meiner Demonstration voniota
dient. Es ist doch ersichtlich, dass die nötige Änderung meinem Einsatz eines Arrays statt desvector
s geschuldet ist, und nicht dem Einsatz voniota
selbst. Ich habe doch nie behauptet, dass mein Code mehr als Pseudo-Code ist, dessen einzige bedeutungsvolle Zeile deriota
-Aufruf ist. Und genauso fordere ich firefly auf, das Beispiel selbst auf die im Eingangspost gegebene Definition vonExample
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.
-
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 einenstd::vector<std::unique_ptr<Foo>>
statt einesstd::vector<Foo>
zu verwenden. Damit kontrollierst du explizit wann ein Objekt erzeugt bzw. zerstört wird, derstd::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 voniota
dient. Es ist doch ersichtlich, dass die nötige Änderung meinem Einsatz eines Arrays statt desvector
s geschuldet ist, und nicht dem Einsatz voniota
selbst. Ich habe doch nie behauptet, dass mein Code mehr als Pseudo-Code ist, dessen einzige bedeutungsvolle Zeile deriota
-Aufruf ist. Und genauso fordere ich firefly auf, das Beispiel selbst auf die im Eingangspost gegebene Definition vonExample
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?
-
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 voniota
dient. Es ist doch ersichtlich, dass die nötige Änderung meinem Einsatz eines Arrays statt desvector
s geschuldet ist, und nicht dem Einsatz voniota
selbst. Ich habe doch nie behauptet, dass mein Code mehr als Pseudo-Code ist, dessen einzige bedeutungsvolle Zeile deriota
-Aufruf ist. Und genauso fordere ich firefly auf, das Beispiel selbst auf die im Eingangspost gegebene Definition vonExample
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?
-
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);
-
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*