2015-04-14 8 views
0

У меня возникли проблемы с итерацией по vector<vector<?> > с помощью функции for_each. Всякий раз, когда я делаю что-то вроде этого (где matrix это мой вложенную вектор):Итератеть над вектором <vector<?>> with for_each

int size = 0;  
for_each(matrix.begin(), matrix.end(), [](vector<int> &vec) { 
    size += vec.size(); 
}); 

Тогда компилятор жалуется на меня с ошибкой expected primary-expression before '[' token (есть более, что одни и те же ошибки, но с ] и & символов) , Что я делаю не так? Пример в cppreference над here имеет схожий синтаксис с int, так что же это отличает?

+0

Что такое '' 'size'''? И как вы переходите к этой лямбда-функции? – mnciitbhu

+0

Какой компилятор и какие флаги? Вероятно, у вас нет C++ 11. Во-вторых, для '' '' '' '' '' '' '' '' '' '' ''. – Yakk

+0

'size' инициализируется только 0 за пределами цикла. Извини за это; подумал, что это будет подразумеваться. Я на самом деле не знаю, какой компилятор он есть, но я просто выполняю стандартную команду 'g ++'. – T145

ответ

2

Вы уверены, что включаете правый заголовок, using namespace std; (я предпочитаю явно префикс std::, как показано ниже) и включение C++ 11 для вашего компилятора? Вам нужно будет также захватить size. Во всяком случае - рабочий код:

#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() 
{ 
    std::vector<std::vector<int>> matrix = { { 1, 2 }, {3, 4, 5}, {6} }; 
    size_t size = 0; 
    std::for_each(matrix.begin(), matrix.end(), [&size](std::vector<int> &vec) { 
     size += vec.size(); 
    }); 
    std::cout << size << '\n'; 
} 

Посмотреть запустить here


Что касается вашего вопроса в комментариях:

What if this is surrounded by another for_each loop that's getting each vector individually; what would that look like?

Вы можете иметь вложенной for_each петли следующим образом, но это не может быть тем, что вам нужно функционально - никоим образом не сказать по такому неопределенному вопросу:

std::for_each(matrix.begin(), matrix.end(), 
     [&size, &matrix](std::vector<int>& outer_vec) 
     { 
      std::for_each(matrix.begin(), matrix.end(), 
       [&size](std::vector<int> &vec) 
       { 
        size += vec.size(); 
       }); 
     }); 
+0

Так что же в скобках есть какая-то часть данных, которую я извлекаю? В чем их цель? Что, если это окружено другим циклом 'for_each', который получает каждый вектор в отдельности; как это будет выглядеть? – T145

+0

В скобках перечислены переменные из охватывающей области, которые вы хотите скопировать или сохранить ссылки, для использования во время вызова лямбда. Специальная нотация '[&]' может использоваться для автоматического захвата ссылок на любые переменные, а '[=]' создает их копии. Для получения дополнительной информации см. [Здесь] (http://en.cppreference.com/w/cpp/language/lambda). –

+0

Ну, теперь я получаю новую ошибку: 'error: 'vec' не был объявлен в этой области' – T145

Смежные вопросы