vector<bool>
-
Hallo, bei der Deklaration dieses Vektors auf ein Problem gestoßen und zwa wenn der Wert für die Größe eine globale Konstante ist.
using namespace std; int main() { const int max = 50; vector <bool> prim(max); return 0; }So gibt es keinen Fehler
using namespace std; const int max = 50; int main() { vector <bool> prim(max); return 0; }So kommt der Fehler: error: reference to ���max��� is ambiguous.
Die Such im Netz ergab, das es mit diesem using namespase std was zutun hat, also:
const int max = 50; int main() { std::vector <bool> prim(max); return 0; }Warum ist das so? Gibt es außerdem eine Möglichkeit alle Elemente des Vektors gleich auf true zu setzen?
-
max()ist eine Funktion im Namensraumstd. Wenn dustdin den globalen Namensraum ausleerst, bekommst du in deinem Fall Namenskonflikte.using namespacesollte mit Bedacht verwendet werden (z.B. nie in Headerdateien).std::vectorhat mehrere Konstruktoren, bei einem kannst du gleich einen Wert für alle Elemente angeben. Schau auf www.cppreference.com nach.
-
Ist es denn auch "richtig", wenn ich dass immer so schreibe?
void function (std::vector<bool> &prim)
-
Falls sich das auf das std:: bezieht: Ja. Im Allgemeinen ist es eher weniger hilfreich, den gesamten std Namensraum aufzulösen.
-
es wird generell abgeraten vector<bool> zu verwenden.
Schau mal hier rein: http://www.gotw.ca/publications/N1211.pdf
-
aasdsad schrieb:
es wird generell abgeraten vector<bool> zu verwenden.
Schau mal hier rein: http://www.gotw.ca/publications/N1211.pdf
Ich sehe wenige Gründe die gegen die Verwendung von vector<bool> sprechen.
-
Nexus schrieb:
max() ist eine Funktion im Namensraum std.
Aber max ist doch eine Konstante, also ich verstehe jetzt nicht warum das so eine Auswirkung hat, ob ich es auserhalb von main festlege oder innerhalb.
-
Ethon_ schrieb:
aasdsad schrieb:
es wird generell abgeraten vector<bool> zu verwenden.
Schau mal hier rein: http://www.gotw.ca/publications/N1211.pdf
Ich sehe wenige Gründe die gegen die Verwendung von vector<bool> sprechen.
Ich zitiere aus Punkt 1: "Although the standard lists
vector<bool>in Clause 23,vector<bool>is not a container andvector<bool>::iteratoris not a random-access iterator (or even a forward or bidirectional iterator either, for that matter). This has already broken user code in the field in mysterious ways."Da du nicht weißt wie der Code irgendwann mal von irgend jemandem verwendet wird, sollte der Programmierer in weiser voraussicht es (mMn= einfach sein lassen und lieber die im Dokument vorgeschlagenen Alternativen verwenden.
-
Namal schrieb:
Aber max ist doch eine Konstante, also ich verstehe jetzt nicht warum das so eine Auswirkung hat, ob ich es auserhalb von main festlege oder innerhalb.
Wenn du den std-Namensraum global deklarierst, dann ist es nicht eindeutig ob max eine Konstante oder die std::max()-Funktion (oder in dem Fall ein Zeiger auf diese Funktion) ist.
-
Namal schrieb:
Aber max ist doch eine Konstante, also ich verstehe jetzt nicht warum das so eine Auswirkung hat, ob ich es auserhalb von main festlege oder innerhalb.
Die Standardbibliothek definiert ein Symbol std::max (Funktion). Mit using namespace std holst Du dieses Symbol in Deinen globalen Namensraum. Du definierst danach ein Symbol max (Konstante). Jetzt existieren zwei Symbole mit dem gleichen Namen im globalen Namensraum. Du könntest mit "max" also einen Funktionszeiger auf std::max oder Deine Konstante meinen.
Wenn die Konstante innerhalb von main definiert ist, wird sie der globalen Definition vorgezogen. Ausserhalb sind die Definitionen gleichberechtigt.
-
warum verwendest du statt einem vector<bool> mit maximal 50 elementen
nicht einfach ein long long (64 Bit) und benutzt nur die ersten 50 bit ??
-
pepe75 schrieb:
warum verwendest du statt einem vector<bool> mit maximal 50 elementen
nicht einfach ein long long (64 Bit) und benutzt nur die ersten 50 bit ??Infwiefern wäre das besser als ein vector<bool> oder bitset? Das ist doch das gleiche, bloß dass man es umständlich selber macht.
-
warum verwendest du statt einem vector<bool> mit maximal 50 elementen
nicht einfach ein long long (64 Bit) und benutzt nur die ersten 50 bit ??Es ist nicht gegeben, dass long long wirklich 64 Bit groß ist.
Außerdem implementiert vector<bool> genau das, es ist nicht etwa wirklich ein vector aus Elementen des Typs bool, sondern arrangiert den vector so, dass jedes Element wirklich nur 1 Bit verbraucht.
-
std::vector<bool>ist eine Optimierung -- eine, für die man einen hohen Preis zahlt.