Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Iterate over vector of pair

I have written following code snippet but it does not seem to be working.

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;
}

It is throwing an error at the line containing for loop. The error is:

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> >*]

Can anyone help me out?

like image 550
Peeyush Avatar asked Sep 01 '14 12:09

Peeyush


People also ask

How to access last element of vector of pair c++?

In C++ vectors, we can access last element using size of vector using following ways. 2) Using back() We can access and modify last value using back().

How to access first element of vector of pairs?

Case 1 : Sorting the vector elements on the basis of first element of pairs in ascending order. This type of sorting can be achieved using simple “ sort() ” function. By default the sort function sorts the vector elements on basis of first element of pairs.


2 Answers

There are at least three errors in the loop.

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

First of all you have to use edges.end() instead of edges.end. And inside the body there has to be

    cout << it->first;

instead of

    cout >> it.first;

To escape such errors you could write simply

for ( const pair<float, pair<int,int> > &edge : edges )
{
   std::cout << edge.first;
}
like image 169
Vlad from Moscow Avatar answered Oct 07 '22 11:10

Vlad from Moscow


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 -> 
}

Also, you might want to add a custom comparator for std::sort

like image 36
P0W Avatar answered Oct 07 '22 11:10

P0W