2014-09-01 2 views
3

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

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

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

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

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

+1

не должно быть, что 'это! = Edges.end() '? Я не вижу, чтобы 'itt' объявлялся где-то – EdChum

+0

. Еще один дикий punt работает, если вы добавите пробел между вашими угловыми скобками в вашем цикле for:' vector >> :: const_iterator'? – EdChum

+0

@EdChum: проблема с прямоугольной скобой была решена с C++ 11 –

ответ

9

Есть по крайней мере три ошибки в цикле.

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

Я смущен, когда использовать '->' и когда использовать '.'. Не могли бы вы помочь? – Peeyush

+1

Итераторы @Peeyush, такие как указатели указателей, также являются особыми типами итераторов). Например, если вы указали указатель на объект std :: pair, вы используете p-> first, p-> second. Точно так же используются итераторы. –

+0

Или просто 'for (const auto & edge: edge)' –

3
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

+0

Как добавить пользовательский сортировку? Лучше ли использовать структуру или класс, а не создавать вектор пары (который содержит поплавок и пару)? – Peeyush

+1

@Peeyush Либо использовать лямбда или функтор в качестве третьего параметра для 'std :: sort', где вы можете выполнить сортировку по желаемому парному элементу. Поиск по SO, есть несколько примеров. Если _really_ lost задал новый вопрос – P0W

Смежные вопросы