перебирая вектор итераторов с помощью итератора - PullRequest
3 голосов
/ 11 марта 2020

В финале я получаю сообщение об ошибке для l oop:

error: conversion from '__normal_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> >*,vector<__gnu_cxx::__normal_iterator<int*, std::vector<int> >>>' to non-scalar type '__normal_iterator<const int*,vector<int>>' requested

   20 | for(vector<int>::const_iterator t=ind.begin(); t != ind.end(); ++t){

      |                                   ~~~~~~~~~^~

Я продолжал искать решения подобных проблем, но все еще не понимаю, что сделал неправильно.

#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,a;
vector<int>::iterator b;
cin>>n>>m;
vector<int> seq(n);
vector<vector<int>::iterator> ind;
for(int i=0;i<n;i++){
    cin>>seq[i];
}
for(int i=0;i<m;i++){
    cin>>a;
    b=find(seq.begin(),seq.end(),a);
    if(b!=seq.end()){
        ind.push_back(b);
    }
}
sort(ind.begin(),ind.end());
for(vector<int>::const_iterator t=ind.begin(); t != ind.end(); ++t){
    cout<<*t;
}
return 0;
}

Ответы [ 2 ]

6 голосов
/ 11 марта 2020

vector<int>::const_iterator является итератором для vector из int. Итератор для вектора итераторов равен vector<vector<int>::iterator>::const_iterator.

Чтобы не печатать такие типы монстров, используйте auto:

for(auto t=ind.begin(); t != ind.end(); ++t){
    cout<<*t;
}

или при итерации от начала до конца используйте диапазон l oop:

for(auto t : ind){
    cout<<t;
}

Поскольку вы не включили ошибку (на момент написания этой статьи), я исправил только очевидную ошибку. Я полагаю, вам нужно разыменовать итератор для печати фактического элемента (ie добавьте * в обоих примерах выше).

2 голосов
/ 11 марта 2020

Вектор ind - это вектор элементов типа std::vector<int>::iterator.

Так что в for для l oop вы должны написать, как минимум, как

vector<vector<int>::iterator>::const_iterator t=ind.begin();

И кажется, что внутри l oop вы имеете в виду

 cout<<**t;

вместо

cout<<*t;
...