2016-04-24 14 views
1

Angenommen, wir haben ein vector von vector s und wir initialisieren alle Elemente auf 0.Iterieren über alle, aber das erste Element in einem Vektor

vector<vector<int>> P(MyObjects.size() + 1, vector<int>(MyBag.MaxCapacity + 1, 0)); 

Meine Frage ist:

Ist es möglich, über iterieren a vector beginnend mit 1 Spalte und 1 in irgendeinem folgenden Code ändern?

for (auto& row : P) //Tried to add (row + 1) : P but I'm receiving an Error 
    { 
    for (auto& elem : row) //Tried to add(elem + 1) : row but I'm receiving an Error 
    { 
     std::cout << elem << " "; 
    } 
    } 

Ich war auf der Suche nach der Antwort hier auf SO und im Web, aber es gab nichts, das sogar so ähnlich war.

bin ich daran interessiert sind nur in Lösungen, die auto

EDIT: Hier ist die Ausgabe von Fehlern

main.cpp:74:18: error: expected ‘;’ before ‘+’ token 
    for (auto& row +1 : P) 
       ^
main.cpp:74:21: error: expected ‘;’ before ‘:’ token 
    for (auto& row +1 : P) 
        ^
main.cpp:74:21: error: expected primary-expression before ‘:’ token 
main.cpp:74:21: error: expected ‘)’ before ‘:’ token 
main.cpp:74:21: error: expected primary-expression before ‘:’ token 

Und es ist ein Code, der ich versuchte,

zu verwenden
for (auto& row + 1 : P) 
    { 
    for (auto& elem + 1 : row) 
    { 
    std::cout << elem << " "; 
    } 
    } 

Ja, ich weiß, dass wir kann folgende Syntax verwenden

for(vector< vector<int> >::iterator row = v.begin() + 1; row != v.end(); ++row) { 
    for(vector<int>::iterator col = row->begin() + 1; col != row->end(); ++col) { 
     cout << *col; 
    } 
} 

aber ich möchte es nicht verwenden.

+1

_ _ Sicher, es ist. Sie stellen wahrscheinlich die falsche Frage. Stellen Sie eine [MCVE] bereit und zeigen Sie Ihre Fehlermeldungen wörtlich an. –

+1

_ "Ich bin nur an Lösungen interessiert, die auto verwenden" _ Das ist ein bisschen wie fragen: _Ich muss eine Schraube aus meiner Wand bohren. Was ist das richtige Werkzeug dafür? Hinweis Ich bin nur an Lösungen mit einem Hammer interessiert (weil das das einzige Werkzeug ist, das ich zur Hand habe) _. –

+0

Sie können keinen Lvalue als Ausdruck haben. – ayushgp

Antwort

4

Der Ausdruck auf der rechten Seite des Kolons hier:

for (auto& row : P) { ... } 
       ^^^ 

hat ein Behälter im Sinne von C++ sein. Etwas, das Sie begin() und end() aufrufen können, ergibt zwei Iteratoren desselben (für jetzt) ​​-Typs, wobei dieser Iterator inkrementierbar, vergleichbar und dereferenzierbar ist.

Wenn das, was Sie tun möchten, ist das erste Element in dem Behälter überspringt, werden Sie eine neue Ansicht von P erstellen müssen, die einfach durch einen den ersten Iterator ausgleicht. Was Sie ändern, ist der Container, über den Sie iterieren, nicht die Werte. So wollen wir so etwas wie:

for (auto& row : offset(P, 1)) { ... } 

offset nimmt einen Behälter und ein Offset, dass es zu P ‚s begin Iterator gelten werden:

template <class C> 
iter_pair<iterator_t<C&>> offset(C& container, size_t skip) { 
    return {std::next(container.begin(), skip), container.end()}; 
} 

Wo iter_pair ist sehr einfach:

template <class It> 
struct iter_pair { 
    It b, e; 

    It begin() const { return b; } 
    It end() const { return e; } 
}; 

Und iterator_t ist Eimer Spaß. Dies ist eine vereinfachte Version: „Ist es möglich, folgende Code ein Vektor ab 1 Spalte und 1 Wechsel in someway iterieren“

template <class C> 
using iterator_t = decltype(std::begin(std::declval<C>())); 

Demo

Verwandte Themen