Verwenden Sie die alte for
Schleife als:
for (auto it = values.begin(); it != values.end(); ++it )
{
auto & value = *it;
//...
}
Damit haben Sie value
ebenso wie Iterator it
. Verwenden Sie alles, was Sie verwenden möchten.
BEARBEITEN:
Ich würde dies zwar nicht empfehlen, aber wenn Sie eine bereichsbasierte for
Schleife verwenden möchten (ja, aus welchem Grund auch immer : D), können Sie dies tun:
auto it = std::begin(values); //std::begin is a free function in C++11
for (auto& value : values)
{
//Use value or it - whatever you need!
//...
++it; //at the end OR make sure you do this in each iteration
}
Dieser Ansatz vermeidet eine gegebene Suche value
, da value
und it
immer synchron sind.
std::find
wenn Sie einen Wert suchen müssen ... Gute alte Algorithmen sind immer noch im neuen Standard.value
undit
möglicherweise nicht synchron. Denken Sie daran,value
ist eine Referenz.++it
,it++
wann immer möglich (beide Verwendungen in Ihrem Code), da dies möglicherweise einen geringeren Overhead hat.Hier ist eine Proxy-Wrapper-Klasse, mit der Sie den verborgenen Iterator durch Aliasing auf Ihre eigene Variable verfügbar machen können.
Verwendung:
quelle
Ich habe es versucht und eine Lösung gefunden.
Verwendung:
Die Umsetzung war nicht so schwierig:
quelle
boost::counting_iterator
jedoch, was genau das tut und bequem verpackt istboost::counting_range
, so dass Sie schreiben können :for(auto it : boost::counting_range(r.begin(), r.end()))
. :)operator++()
sollte zurückkehrenInnerIterator
, sonst sehr nett und uesful.Die bereichsbasierte
for
Schleife wird als C ++ - Gegenstück fürforeach
Java erstellt, das eine einfache Iteration von Array-Elementen ermöglicht. Es ist dazu gedacht, die Verwendung komplexer Strukturen wie Iteratoren zu entfernen, um es einfach zu machen. Wenn du willstiterator
, wie Nawaz sagte, musst du eine normalefor
Schleife verwenden.quelle
for
Reduzierung der Schreibmenge. Wenn der Iterator dereferenziert werden muss, ist er fehleranfällig, insbesondere wenn er mitauto
Es gibt eine sehr einfache Möglichkeit, dies zu tun
std::vector
, die auch funktionieren sollte, wenn Sie die Größe des Vektors während des Vorgangs ändern (ich bin nicht sicher, ob die akzeptierte Antwort diesen Fall berücksichtigt).Wenn
b
es Ihr Vektor ist, können Sie es einfach tunWo
iter
wird Ihr erforderlicher Iterator sein?Dies nutzt die Tatsache aus, dass C ++ - Vektoren immer zusammenhängend sind .
quelle
vector<T>::iterator
zuT*
: Überprüfen Sie, ob mit einstatic_assert()
, dann nur verwendenT* iter = &i;
.Lass es uns sehr schmutzig machen ... Ich weiß, die 0x70h ändert sich mit der Stack-Nutzung, der Compiler-Version, .... Sie sollte vom Compiler verfügbar gemacht werden, ist aber nicht :-(
quelle