2016-04-24 12 views
1

Предположим, мы имеем vectorvector о с и инициализируем все элементы 0.перебирает все, но первый элемент в векторе

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

Мой вопрос:

Можно перебрать a vector, начиная с 1 колонки и 1, изменяя каким-то образом следующий код?

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 << " "; 
    } 
    } 

Я искал ответ здесь, на SO и в Интернете, но ничего подобного ему не было.

Я заинтересован только в растворах, которые используют auto

EDIT: Вот вывод ошибок

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 

И есть код, который я пытался использовать

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

Да, я знаю, что мы может использовать следующий синтаксис:

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; 
    } 
} 

но я не хочу его использовать.

+1

_ _ Конечно, это. Вероятно, вы задаете неправильный вопрос. Предоставьте [MCVE] и покажите свои сообщения об ошибках дословно. –

+1

_ «Меня интересуют только решения, которые используют авто». Это немного похоже на вопрос: «Мне нужно развернуть винт из моей стены. Какой правильный инструмент для этого? Примечание. Меня интересуют только решения с использованием молотка (потому что это единственный инструмент, который у меня есть). –

+0

Вы не можете иметь lvalue как выражение. – ayushgp

ответ

4

Выражение в правой части толстой кишки здесь:

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

должен быть контейнером в том смысле, C++. Что-то, что вы можете назвать begin() и end(), что дает два итератора того же типа (на данный момент), где этот итератор является инкрементальным, сопоставимым и разыменованным.

Если то, что вы хотите сделать, это пропустить первый элемент в контейнере, вам необходимо создать новый вид из P, что просто смещает первый итератор на один. То, что вы изменяете, - это контейнер, который вы повторяете, а не значения. Так что мы хотим что-то вроде:

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

offset принимает контейнер и смещение, оно будет применяться к P «ы begin итератора:

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

Где iter_pair очень проста:

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

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

И iterator_t это ведра веселья. Это упрощенная версия: «Можно ли перебрать вектор, начиная с 1 колонка и 1 меняется в следующем коде некоторым образом»

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

Demo