2013-10-11 4 views
1

С приведенным ниже кодом, я пытаюсь обновить значения в наборе, но не компилировать, когда пытаюсь скомпилировать.Изменение элементов набора

Это дает мне ошибку внизу, не могли бы вы помочь?

Что я здесь делаю?

#include <iostream> 
#include <set> 

using namespace std; 

class A 
{ 
    public: 

    int a,b; 

    bool operator()(A a1,A a2) 
    { 
     return true; 
    } 

    A(int a ,int b) 
    { 
     this.a=a; 

     this.b=b; 
    } 

}; 

void print_set(const std::set<A>&st) const 
{ 
    std::set<A>::iterator it; 
    std::cout<<"\nvalues in set"; 

    for(it=st.begin();it!=st.end();it++)  
    { 
     std::cout<<"\na="<<it->a<<"b="<<it->b; 
    } 
} 


int main() 
{ 
    std::set<A> s; 

    for (int i=0;i<5;i++) 
    { 
     s.insert(A(i,i+1)); 
    } 

    print_set(s); 

    std::set<A>::iterator it; 

    for(it=s.begin();it!=s.end();it++) 
    { 
     A tmp=*it; 

     s.erase(it); 
     tmp.a=10; 
     tmp.b=20; 
     s.insert(tmp); 

     std::cout<<"\ninserting tmp "<<tmp.a<<" "<<tmp.b; 
    } 

    print_set(s); 

    return 0; 
} 

Я получаю сообщение об ошибке, как это:

/usr/include/c++/4.6/bits/stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = A]’: 
/usr/include/c++/4.6/bits/stl_tree.h:1277:4: instantiated from ‘std::pair<std::_Rb_tree_iterator<_Val>, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = A, _Val = A, _KeyOfValue = std::_Identity<A>, _Compare = std::less<A>, _Alloc = std::allocator<A>]’ 
+2

пожалуйста также опубликовать сообщение об ошибке, дикое предположение, хотя: я Не уверен, что вы можете объявить функцию как const, если она не является функцией класса, а итератору в цикле for требуется объявление типа, префиксное к нему. – mtijn

+1

Наборы - это контейнеры, которые хранят уникальные элементы в соответствии с определенным заказом. По умолчанию они используют 'operator <' для сравнения элементов, поэтому вам нужно определить 'operator <' for you 'class A' –

+0

Это не все сообщение об ошибке. Этот фрагмент только говорит, где ошибка. Он не говорит, что такое ошибка. Подсказка: фактическая ошибка содержит слово «ошибка». Постарайтесь прочитать и понять это. –

ответ

2

Несколько вопросов в вашем коде см ниже комментарии:

A(int a ,int b) 
{ 
    //this.a=a; 
    //this.b=b; 
    this->a = a; // this pointer should be accessed by this-> 
    this->b = b; 
} 

// to store element in std::set, it must follow strict weak ordering rule. 
// by default, operator< need to be defined 
bool operator<(const A& lhs, const A& rhs) 
{ 
    return lhs.a < rhs.a; 
} 

// print_set is not a member function, can't have trailing const after function name 
void print_set(const std::set<A>&st) // const 
+0

'lhs .a

+0

@ н.м. ха-ха, да. Я немного пьян. fixed – billz

+0

И также ** незаконно ** использовать итератор после того, как вы удалили элемент, к которому он обращался (поэтому вы не должны использовать 'it ++' в 'for' после' s.erase (it); 'в for's тела) –

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