Как пройти через вектор с помощью итератора и доступа к значению элемента? - PullRequest
0 голосов
/ 14 апреля 2020

Я начал использовать итераторы для обхода вектора. Обычно я использовал бы это для go через вектор:

for( int i=0; i< vector.size(); i++){
    cout<<vector[i];
}

Я узнал, что если я хочу использовать итераторы, мне придется сделать что-то вроде этого:

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

Но , если я хочу получить доступ к значению, на которое указывает итератор, как бы я это сделал?

Я попытался сделать это:

 int temp = *col;

, но это дает ошибку

Назначение 'int' из несовместимого типа 'std :: __ 1 :: vector '

Я пытаюсь это сделать, потому что у меня есть двумерный вектор, и я пытаюсь найти сумму отдельных столбцов.

1 Ответ

0 голосов
/ 14 апреля 2020

Код, который вы показали, правильный ... для одномерного вектора . Но вы говорите, что на самом деле используете 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...
}
...