2016-04-26 28 views
1

Nehmen wir an, ich habe einen Vektor von Zeichenfolgen wie unten definiert.Iterieren durch bestimmte Elemente eines Vektors mit einem anderen Vektor

std::vector<std::string> names; 
names.push_back("Zero" ); 
names.push_back("One" ); 
names.push_back("Two" ); 
names.push_back("Three"); 
names.push_back("Four" ); 
names.push_back("Five" ); 
names.push_back("Six" ); 
names.push_back("Seven"); 
names.push_back("Eight"); 
names.push_back("Nine" ); 

Auch, lassen Sie uns sagen, dass ich einen Vektor haben, die, welche Elemente in einer Schleife definiert durch:

std::vector<int> indices; 
indices.push_back(0); 
indices.push_back(5); 
indices.push_back(6); 

Wie kann ich auf dem Vektor iterieren names nach den Elementen des Vektors indices zu zum Beispiel Zugang Namen: "Zero", "Five" und "Six"? Ich weiß, dass:

for(vector<string>::iterator it=names.begin() ; it < names.end(); it++) 

Iterierte über alle Elemente oder Elemente, für die wir ein Muster finden können, beispielsweise jedes andere Element, etc. Aber, wie etwa über die Elemente iteriert die kein Muster oder schwer haben, ein Muster zu finden? Wie kann ein Vektor für die Iteration in einem anderen Vektor verwendet werden? Etwas wie:

for(vector<int>::iterator it=indices.begin() ; it < indices.end(); it++) 
{ 
    names.at(indices.at(it)) 
    ... 
} 

Antwort

1

Sie können auch einen std::for_each Anruf mit einem Lambda verwenden, um die indicies (Version 1) Außerdem zuzugreifen, könnten Sie eine bereichsbasierte for-Schleife mit rvalues (Version 2)

#include <vector> 
#include <algorithm> 

int main() 
{ 
    std::vector<std::string> names; 
    names.push_back("Zero"); 
    names.push_back("One"); 
    names.push_back("Two"); 
    names.push_back("Three"); 
    names.push_back("Four"); 
    names.push_back("Five"); 
    names.push_back("Six"); 
    names.push_back("Seven"); 
    names.push_back("Eight"); 
    names.push_back("Nine"); 

    std::vector<int> indices; 
    indices.push_back(0); 
    indices.push_back(5); 
    indices.push_back(6); 

    // version 1 
    std::for_each(std::cbegin(indices), std::cend(indices), 
    [&](auto &idx) { std::cout << names.at(idx) << "\n";}); 

    // version 2 
    for (auto &&idx : indices) 
    std::cout << names.at(idx) << "\n"; 

    return 0; 
} 
+0

Anscheinend verwenden, 'Auto 'ist problematisch für' C + 11'. Der Compiler beschwert sich über 'automatische Änderungen Bedeutung in C++ 11; Bitte entfernen Sie es. – AFP

+0

Das ist spezifisch für 'C++ 14'. Wenn Sie 'C++ 11' verwenden, müssen Sie' auto' durch den spezifischen Typ ersetzen. – foo

2

Es ist so einfach, wie folgt aus:

for(vector<int>::iterator it=indices.begin() ; it != indices.end(); ++it) 
{ 
    names.at(*it); 
    names[*it]; // for faster but unvalidated access 
    ... 
} 

Hinweis: ++it könnte schneller sein (kann aber nicht langsamer sein), so ist es in der Regel verwendet, wenn Sie sich nicht, wenn es Postfix ist oder Präfixform. it != container.end() wird auch normalerweise verwendet, weil es generischer ist (weniger als für den Direktzugriffs-Iterator, aber nicht für den Vorwärts-Iterator).

3

Ihr Vorschlag ist fast richtig. Statt insdices.at(it) sollten Sie den Iterator dereferenzieren. Aber man kann es einfach tun, wie folgt aus:

for(int index : indices) { 
    names[index]; 
} 

Oder können Sie vector::at verwenden, wenn Sie nicht, dass names.size()>indices[i] für alle i beweisen können.

Verwandte Themen