2016-04-07 7 views
2

Ich möchte einen Vektor, dessen Elemente vom Typ vector :: size_typeWie deklariere ich einen Vektor von vector :: size_type?

Sie können jedoch nicht erklären:

vector<vector::size_type> aVec; 

weil size_type Teil der Vorlage selbst, so dass Sie die Art selbst verwenden , ich brauche so etwas wie:

vector<vector<T>::size_type> aVec; 

aber was soll das T sein? Es ist wirklich ein zirkuläres Problem. :)

Wenn Vektor nur size_t als seine Größe Typ benutzt hatte (aber nicht eine besondere typedef für die size_type hatte, die vielleicht von der Art variieren basierend könnte, dass der Vektor hält), konnte ich nur tun:

vector<size_t> aVec; 

aber das ist nicht der Fall. Ich vermute, es gibt einen triftigen Grund dafür, dass es variieren darf, aber es macht dies schwierig, indem es Teil der Vektorklasse ist, statt außerhalb davon.

Gedanken?

+2

Ich sehe keine echte Anwendung von diesem. Ihr Vektortyp wird durch das definiert, was in ihm gespeichert ist. Sie möchten die Größen des Vektors speichern? Welcher Art? – SergeyA

+0

Was wollen Sie eigentlich erreichen? – NathanOliver

+6

Wenn Sie etwas wie das Speichern von Indizes in einem anderen Vektor tun, tun Sie othervector :: size_type. Wenn Sie nicht den Schablonentyp für Vektor haben, macht es keinen Sinn, zu versuchen, 'size_type' dafür zu bekommen. Verwenden Sie 'size_t' – David

Antwort

1

std::vector<>::size_type ist statisch Elementtyp des Typs std::size_t so sollten Sie mit std::vector<std::size_t> vec

+0

Es ist nicht garantiert, "size_t" zu sein. – David

+1

Der Standard definiert 'size_type' als' typedef implementation-defined size_type; '. Wir können nicht wirklich wissen, was es ist, ohne die Implementierung zu überprüfen. Alles was wir wissen ist, dass es unsigned sein muss und size_type kann einen beliebigen nicht-negativen Wert von difference_type – NathanOliver

+1

@NathanOliver darstellen Die Standardcontainer definieren 'size_type' als typedef zu' Allocator :: size_type' was für 'std :: Zuweiser "ist definiert als" Größe_t ". Da kein benutzerdefinierter Zuordner angegeben ist, wird "std :: allocator" verwendet. – Quest

1

Warum Sie vector<vector<int>::size_type> myVector; verwenden nicht sicher sein? Wenn Sie den Typ vector<int> nirgendwo sonst verwenden, kostet es nichts, da die Template-Instanziierung irgendwie faul ist. Sie können einen anderen Typ als int verwenden, wenn Sie welche.

Es ist sehr unwahrscheinlich, dass vector<T>::size_type sich von vector<T'>::size_type unterscheidet.

+2

"* Es ist sehr unwahrscheinlich, dass' vector :: size_type' anders als 'vector :: size_type'. *" Eigentlich wäre es unmöglich, da beide 'std :: allocator' verwenden, die immer verwendet 'std :: size_t'. – ildjarn

1

(ich rewritting eine Antwort hier, ohne diesmal keinerlei Ansprüche auf den Standard zu machen.)

Sie können Ihre best guess für die Art machen und prüfen Sie nach der (die std::size_t oder std::vector<void*>::size_type sein kann) Tatsache.

std::vector<std::size_t> Avec; 
static_assert(std::is_same<decltype(Avec)::size_type, decltype(Avec)::value_type>(), "bad guess"); 
+1

Ich denke auch, dass es eine beste Lösung ist.Es ist zumindest tragbar =) – Orient

+0

Ja, ich dachte, dass size_t könnte der Weg zu gehen: 'mit SizeT = std :: vector :: size_type;' ' std :: vector myVec;' Aber ich habe auch gemerkt, dass dies auch eine rein theoretische Frage war. Danke an alle die kommentiert haben! :) – Mark

Verwandte Themen