Код, который вы показали, правильный ... для одномерного вектора . Но вы говорите, что на самом деле используете 2D вектор , и в этом случае элементы внешнего вектора сами являются векторами, и поэтому разыменование итератора для внешнего вектора дает вам ссылку на внутренний вектор. Это именно то, на что жалуется сообщение об ошибке - вы пытаетесь присвоить внутренний vector
для int
, который, очевидно, не будет работать. Вы должны будете выполнить итерацию этого внутреннего вектора отдельно, так же, как и при использовании индексов вместо итераторов, например:
std::vector<std::vector<int> > rows_vec;
...
/*
for(size_t row_idx = 0; row_idx < rows_vec.size(); ++row_idx){
std::vector<int> &row_vec = rows_vec[row_idx];
int sum_cols = 0;
for(size_t col_iter = 0; col_idx < row_vec.size(); ++col_idx){
sum_cols += row_vec[col_idx];
}
// use sum_cols as needed...
}
*/
std::vector<std::vector<int> >::iterator row_iter;
for(row_iter = rows_vec.begin(); row_iter != rows_vec.end(); ++row_iter){
std::vector<int> &row_vec = *row_iter;
std::vector<int>::iterator col_iter;
int sum_cols = 0;
for(col_iter = row_vec.begin(); col_iter != row_vec.end(); ++col_iter){
sum_cols += *col_iter;
}
// use sum_cols as needed...
}
Если вы используете C ++ 11 или более позднюю версию, это может быть очень упрощается при использовании на основе диапазона for
петли :
std::vector<std::vector<int>> rows_vec;
...
for(auto &row_vec : rows_vec){
int sum_cols = 0;
for(int col_val : row_vec){
sum_cols += col_val;
}
// use sum_cols as needed...
}
Что можно упростить, если использовать стандартный алгоритм std::accumulate()
, например:
std::vector<std::vector<int>> rows_vec;
...
for(auto &row_vec : rows_vec){
int sum_cols = std::accumulate(row_vec.begin(), row_vec.end(), 0);
// use sum_cols as needed...
}