Перебрать вектор пары

Я написал следующий фрагмент кода, но, похоже, он не работает.

int main(){
    int VCount, v1, v2;
    pair<float, pair<int,int> > edge;
    vector< pair<float, pair<int,int> > > edges;
    float w;
    cin >> VCount;
    while( cin >> v1 ){
        cin >> v2 >> w;
        edge.first = w;
        edge.second.first = v1;
        edge.second.second = v2;
        edges.push_back(edge);
    }
    sort(edges.begin(), edges.end());
    for ( vector < pair<float,pair<int,int>> >::const_iterator it = edges.begin() ; itt != edges.end; it++){
        cout >> it.first;
    }
    return 0;
}

Выдает ошибку в строке, содержащей цикл for. Ошибка:

error: no match for ‘operator<’ in ‘it < edges.std::vector<_Tp, _Alloc>::end [with _Tp = std::pair<float, std::pair<int, int> >, _Alloc = std::allocator<std::pair<float, std::pair<int, int> > >, std::vector<_Tp, _Alloc>::const_iterator = __gnu_cxx::__normal_iterator<const std::pair<float, std::pair<int, int> >*, std::vector<std::pair<float, std::pair<int, int> > > >, typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::const_pointer = const std::pair<float, std::pair<int, int> >*]

Может кто-нибудь мне помочь?


person Peeyush    schedule 01.09.2014    source источник
comment
разве это не должно быть it != edges.end()? Я нигде не вижу объявления itt   -  person EdChum    schedule 01.09.2014
comment
Еще один дикий вопрос: сработает ли это, если вы добавите пробел между угловыми скобками в цикле for: vector < pair<float,pair<int,int> > >::const_iterator?   -  person EdChum    schedule 01.09.2014
comment
@EdChum: проблема с прямыми угловыми скобками была решена, начиная с C++ 11   -  person Piotr Skotnicki    schedule 01.09.2014
comment
@ПиотрС. Зависит от компилятора, поэтому это дикая плоскодонка   -  person EdChum    schedule 01.09.2014
comment
@EdChum: нет, каждый компилятор C++11 должен правильно обрабатывать >>   -  person Piotr Skotnicki    schedule 01.09.2014
comment
Вы должны опубликовать реальный код. Приведенный выше код вызовет больше ошибок, чем это.   -  person Jonathan Potter    schedule 01.09.2014
comment
@ПиотрС. здесь нет указаний на то, что это С++ 11, вы правы, но я хотел подчеркнуть, что некоторые компиляторы не справляются с этим до С++ 11   -  person EdChum    schedule 01.09.2014


Ответы (2)


В цикле не менее трех ошибок.

for ( vector < pair<float,pair<int,int>> >::const_iterator it = edges.begin() ; itt != edges.end; it++){
        cout >> it.first;
    }

Прежде всего, вы должны использовать edges.end() вместо edges.end. И внутри тела должно быть

    cout << it->first;

вместо

    cout >> it.first;

Чтобы избежать таких ошибок, вы можете написать просто

for ( const pair<float, pair<int,int> > &edge : edges )
{
   std::cout << edge.first;
}
person Vlad from Moscow    schedule 01.09.2014
comment
Я запутался, когда использовать -> и когда использовать .. Не могли бы вы помочь? - person Peeyush; 01.09.2014
comment
Итераторы @Peeyush, такие как указатели указателей, также являются особыми видами итераторов). Когда у вас, например, есть указатель на объект std::pair, вы используете p-›first, p-›second. Точно так же используются итераторы. - person Vlad from Moscow; 01.09.2014
comment
Или просто for ( const auto& edge : edges ) - person Anton Savin; 01.09.2014
comment
@VladfromMoscow Следующий код работает для меня, но, по вашему мнению, не должен, если я правильно вас понимаю? (может быть, эта проблема была исправлена ​​в c++ 17 случайно?) Graph::Graph(vector<pair<int, int>>& edges, int nVert) { adjList.resize(nVert); for(auto i: edges) { adjList[i.first].push_back(i.second); adjList[i.second].push_back(i.first); } @AntonSavin автоматически даст ему какой-то другой итератор, чем назначенный вручную vector < pair<float,pair<int,int>> >::const_iterator? - person Xgh05t; 17.01.2020
comment
@ gh05t Здесь вы используете диапазон, основанный на цикле for, показанном в конце моего ответа. - person Vlad from Moscow; 17.01.2020
comment
О да, это удалит внутреннюю ссылку на итератор, и вам не придется делать это вручную, тогда понятно, спасибо! (момент пуканья мозга, лол) - person Xgh05t; 17.01.2020

for ( vector < pair<float,pair<int,int>> >::const_iterator it = edges.begin() ; 

     it != edges.end () ;  // Use (), and assuming itt was a typo
     it++)
{
    cout << it->first; // Use -> 
}

Кроме того, вы можете добавить собственный компаратор для std::sort

person P0W    schedule 01.09.2014
comment
Как добавить пользовательскую сортировку? Лучше ли использовать структуру или класс, а не создавать вектор пары (который содержит поплавок и пару)? - person Peeyush; 01.09.2014
comment
@Peeyush Либо используйте лямбда, либо функтор в качестве третьего параметра для std::sort, где вы можете выполнить сортировку по нужному парному элементу. Ищите на SO, есть несколько примеров. Если действительно заблудился, задайте новый вопрос - person P0W; 01.09.2014