2013-03-01 9 views
21

Mein Code ist wie folgt:Erhalten Index des aktuellen Elements in C++ bereichsbasierte for-Schleife

std::cin >> str; 
for (char c : str) 
    if (c == 'b') vector.push_back(i) //while i is the index of c in str 

Ist das machbar? Oder muss ich mit der Old-School-for-Loop gehen?

+0

@MarkGarcia Bedeutung? Ich denke, es läuft, aber ich vermisse die Methode, um "ich" in die Schleife zu bekommen. –

+0

@chris Ich habe den Code bearbeitet, damit er etwas bedeutet. Es ist dumm, einfach "0 ... n" zum Vektor zu drücken. Ich habe einen bedingten Ausdruck. –

+1

Fast das gleiche: http://stackoverflow.com/questions/10962290/find-position-of-element-in-c11-range-based-for-loop – jogojapan

Antwort

15

str Angenommen wird ein std::string oder ein anderes Objekt mit sequenziellen Speicher:

std::cin >> str; 
for (char& c : str) 
    if (c == 'b') v.push_back(&c - &str[0]); 
+0

Schön! Ich dachte, dass Vektoren so etwas wie 'it - vector.begin()' verwenden können, und Sie haben mein Problem gelöst! Vielen Dank! –

+0

Danke! Ich habe '& it - & vector [0] 'kompiliert. Aber gibt es einen netten Weg wie @ShaneHsus Kommentar? Ich fand heraus, dass ich '& it - vector.begin()' mit Iteratoren wie 'const initialiser_list & it' verwenden musste. In einer Schleife wie 'for (const pair & it: vector_of_pairs)' ergibt dies einen Fehler: _keine Übereinstimmung für 'operator-' (Operandentypen sind 'const pair *' und Vektor > :: const_iterator_ Wie kann ich die Adresse des Iterators erhalten? (Beachten Sie, dass ersteres in einem ctor ist, während letzteres in einer const-Methode ist) – gr4nt3d

+0

Beachten Sie, wenn der zugrundeliegende Speicher sich nicht mehr in einen Vektortyp ändert, bricht er ab.Wahrscheinlich würde Ihre Integer-basierte Semantik dann auch brechen ... also ist das kein starker Punkt dagegen. Aber es fühlt sich an, als würden Sie dadurch Ihr Engagement für zusammenhängenden Speicher stärken. –

4

Das, was Sie beschreiben, ist in anderen Sprachen als Operation "mit Index" bekannt. Wenn man etwas schnell googelt, scheint es, dass außer der 'Old-School-for-Loop'-Methode einige ziemlich komplizierte Lösungen mit C++ 0x Lambas oder möglicherweise einigen von Boost bereitgestellten Edelsteinen vorhanden sind.

EDIT: Als Beispiel sehen diese question

5

Der Bereich Schleife wird der Index nicht geben. Es soll solche Konzepte abstrahieren und Sie einfach durch die Sammlung iterieren lassen.

23

Vielleicht ist es genug, um eine Variable i zu haben?

Auf diese Weise müssen Sie nicht die bereichsbasierte Schleife ändern.

+1

Es ist eine Lösung, aber es ist nicht elegant. Außerdem denke ich, dass es sinnlos sein wird, da es eine herkömmliche for-Schleife in einem bereichsbasierten implementiert. –

+9

Vielleicht ist es nicht elegant, aber es ist die Basis für Komplexität, Lesbarkeit, Overhead usw. für alle anderen bevorstehenden Lösungen/Work-Arounds. –

+8

Sicher. Aber ich denke wirklich, dass es in der C++ Range-Based for-Schleife einen konstanten "Index" geben sollte. –

4

Sie können Lambdas in C++ verwenden 11:

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
#include <iterator> 

using namespace std; 


int main() { 
    std::string str; 
    std::vector<char> v; 
    auto inserter = std::back_insert_iterator<decltype(v)>(v); 

    std::cin >> str; 
    //If you don't want to read from input 
    //str = "aaaaabcdecccccddddbb"; 

    std::copy_if(str.begin(), str.end(), inserter, [](const char c){return c == 'b';}); 

    std::copy(v.begin(),v.end(),std::ostream_iterator<char>(std::cout,",")); 

    std::cout << "Done" << std::endl; 

} 
+0

Es scheint sicher kompliziert, aber es ist definitiv wert zu lernen! Danken! Ich werde es mir ansehen. –

+0

Dies beantwortet die Frage nicht. Das OP wollte den numerischen Index der Instanzen von 'b', nicht die Instanzen selbst. – mskfisher

Verwandte Themen