list-iterator + distance
-
hallo
wie sollte man den difference_type eines listen-iterators wählen? (doppelt verkettete liste)
ich hab bis jz ein einfaches typedef auf den size_type (was wiederrum nen typedef auf std::size_t ist).
Eigentlich sollte das ja reichen, weil nur std::distance den typen wirklich verwendet, oder irre ich mich da?dann habe ich direkt noch ne frage zu distance:
http://www.cplusplus.com/reference/std/iterator/distance/ schrieb:
The number of increments or decrements needed to get from first to last.
wie soll das funktionieren?
wenn ich das richtig verstanden habe, geht nur einwas von beiden - sinnigerweise increment (und bei random access natürlich ne einfache subtraktion)
ist distance so gedacht, dass man auchstd::distance(liste.end(), liste.begin())aufrufen kann?
also zumindest, wenn man den iterator vonstd::bidirectional_iterator_tagabgeleitet hat, macht das auf der einen seite ja durchaus Sinn - und der difference-type müsste dann auch negativ werden können - auf der anderen seite weiß man ja eigtl schon immer, in welche richtung man gehen möchte und damit reicht der unsigned wert wieder als difference_type.der zweite Anwendungsbereich, der mir noch eingefallen ist, wäre std::advance - allerdings nutzt das den difference_type offensichtlich gar nicht, sondern es gibt noch nen extra template-parameter dafür.
bb
-
Ich denke, damit ist gemeint "die Anzahl der Inkrementierungen von begin nach end beziehungsweise die Anzahl der Dekrementierungen von end nach begin".
Von distance bei einer doppelt verkettten Liste zu erwaten, daß es in die Kristallkugel blickt und den kurzen Weg über die zehn Knoten findet, statt zuerst die zweihundertfünfig Millionen Knoten in Richtung eines Listenendes zu laufen, wäre sehr untypisch für C++.
-
volkard schrieb:
Von distance bei einer doppelt verkettten Liste zu erwaten, daß es in die Kristallkugel blickt und den kurzen Weg über die zehn Knoten findet, statt zuerst die zweihundertfünfig Millionen Knoten in Richtung eines Listenendes zu laufen, wäre sehr untypisch für C++.
ja - und außerdem imho auch noch (mit den parametern) nicht implementierbar - weil end und begin nicht bekannt sind...
was ich ja eigtl wissen wollte:
also ist size_t als difference_type bei listen vollkommen ok?!bb
-
unskilled schrieb:
wie sollte man den difference_type eines listen-iterators wählen? (doppelt verkettete liste)
ich hab bis jz ein einfaches typedef auf den size_type (was wiederrum nen typedef auf std::size_t ist).Ich dachte, dass difference_type ein vorzeichenbehafteter Ganzzahltyp sein soll. Das ist ja auch der Typ, den zB std::advance erwartet, um einen Iterator zu bewegen (auch rückwärts). Der Default-Typ für difference_type (siehe std::iterator [1]) ist auch std::ptrdiff_t.
[1] http://www.cplusplus.com/reference/std/iterator/iterator/
Gruß,
SP
-
Sebastian Pizer schrieb:
Das [ein vorzeichenbehafteter Ganzzahltyp] ist ja auch der Typ, den zB std::advance erwartet, um einen Iterator zu bewegen (auch rückwärts).
advance hat (wie oben geschrieben) nen template-parameter dafür
Sebastian Pizer schrieb:
Der Default-Typ für difference_type ist auch std::ptrdiff_t.
jopp - deshalb hab ich ja angefangen zu zweifeln - und, weil evtl ja auch iwer mal eine entfernung speichern möchte, die nicht zwingend positiv ist...
wobei ich mir die frage ja mit der idee gerade selbst beantwortet habe ^^
also werd ichs wohl in ptrdiff_t ändern - danke für den denkanstoß

bb