assignment of read-only location?



  • Hi, habe ein Problem und hoffe mir kann hier jemand helfen. Habe folgende funktion geschrieben und verstehe leider die Fehlermeldung nicht.

    static bool similar (set<int>& s1, set<int>& s2) {
       set<int> result;
       set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), result.begin());
       int intersection = result.size();
       set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), result.begin());
       return ((1 - (intersection / result.size())) >= t_s);
    }
    

    Die Funktion wird auch korrekt aufgerufen.

    set<int>* s;
    ...
    if (similar(s[j],s[j+1]))
    

    /usr/include/c++/4.0.0/bits/stl_algo.h instantiated from '_OutputIterator std::set_union(_InputIterator1, _InputIterator1, _InputIterator2, _InputIterator2, _OutputIterator) [with _InputIterator1 = std::_Rb_tree_const_iterator<int>, _InputIterator2 = std::_Rb_tree_const_iterator<int>, _OutputIterator = std::_Rb_tree_const_iterator<int>]' Mat line 4124 1200544330468 16492
    /usr/include/c++/4.0.0/bits/stl_algo.h assignment of read-only location Mat line 4107 1200544330466 16486
    /usr/include/c++/4.0.0/bits/stl_algo.h assignment of read-only location Mat line 4112 1200544330467 16487
    /usr/include/c++/4.0.0/bits/stl_algo.h assignment of read-only location Mat line 4117 1200544330467 16488
    /usr/include/c++/4.0.0/bits/stl_algo.h assignment of read-only location Mat line 4233 1200544330466 16485
    /usr/include/c++/4.0.0/bits/stl_algobase.h instantiated from '_OI std::__copy_aux(_II, _II, _OI) [with _II = std::_Rb_tree_const_iterator<int>, _OI = std::_Rb_tree_const_iterator<int>]' Mat line 317 1200544330467 16489
    /usr/include/c++/4.0.0/bits/stl_algobase.h instantiated from '_OutputIterator std::copy(_InputIterator, _InputIterator, _OutputIterator) [with _InputIterator = std::_Rb_tree_const_iterator<int>, _OutputIterator = std::_Rb_tree_const_iterator<int>]' Mat line 387 1200544330468 16491
    /usr/include/c++/4.0.0/bits/stl_algobase.h instantiated from 'static _OI std::__copy_normal<<anonymous>, <anonymous> >::copy_n(_II, _II, _OI) [with _II = std::_Rb_tree_const_iterator<int>, _OI = std::_Rb_tree_const_iterator<int>, bool <anonymous> = false, bool <anonymous> = false]' Het line 326 1200544330467 16490
    /usr/include/c++/4.0.0/bits/stl_algobase.h assignment of read-only location Mat line 270 1200544330468 16493
    make: *** [source/hardClustering.o] Error 1 Mat line 0 1200544330469 16495



  • Was ist t_s?
    Wenn result.size() 0 ist schmiert dein Programm ab.



  • Du kannst ein set<> nicht direkt als Ziel eines Algorithmus verwenden, weil es seine Schlüssel als konstante Elemente speichert. (und per STL-Algorithmus in einen leeren Container zu schreiben ist sowieso keine gute Idee)

    Die Lösung hierfür nennt sich Insert-Iteratoren:

    static bool similar (set<int>& s1, set<int>& s2) {
       set<int> result;
       set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(result,result.begin()));
       int intersection = result.size();
    //   set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), result.begin());
       int union_count = s1.size()+s2.size()-intersection;//mit ein paar Kenntnissen in Mengenleere kannst du dir den union-Aufruf sparen ;)
       return ((1 - (intersection / union_count)) >= t_s);
    }
    


  • int union = ... dürfte eigentlich nicht gehen. Keywords und so. :p 😉

    Auch hier noch das Problem das durch 0 geteilt werden kann am Ende.



  • Fellhuhn schrieb:

    int union = ... dürfte eigentlich nicht gehen. Keywords und so. :p 😉

    Punkt für dich - daran hatte ich nicht gedacht.

    Auch hier noch das Problem das durch 0 geteilt werden kann am Ende.

    Ja, darauf bin ich auch nicht näher eingegangen - das muß nochmal gesondert überprüft werden.



  • Kann statt union ja struct nehmen. 😉 😃 SCNR



  • Meine Mengen sind nichtleer, daher ist Division durch null ausgeschlossen und t_s ist ein Grenzwert > 0.
    Aber danke fuer den Tip mit dem inserter und die Nachhilfe in Mengenlehre (haett ich eigentlich wissen muessen)
    Hat geholfen. 👍



  • Babahm43 schrieb:

    Meine Mengen sind nichtleer, daher ist Division durch null ausgeschlossen und t_s ist ein Grenzwert > 0.

    Und wie stellst du das sicher? Die Funktion dort weiß nicht, ob die übergebenen Mengen leer sind - und überprüft es auch nicht.

    PS: Was mir im Nachhinein aufgefallen ist: Du rechnest mit Ganzzahl-Arithmetik - und da wird die Division "intersection/union_count" nur dann einen Wert ungleich 0 liefern, wenn deine Mengen identisch sind.



  • Das ergibt sich aus dem restl. Programm und wie die Mengen erstellt werden. Ein zusaetzlicher check waere wahrscheinlich trotzdem nicht unangebracht.
    Mit der Ganzzahlarithmetik hast du vollkommen recht, dumm von mir. Koennt ich ja direkt schreiben return true. 😉



  • Babahm43 schrieb:

    Koennt ich ja direkt schreiben return true. 😉

    Ja, könntest du vermutlich (wenn t_s kleiner als 1 ist, wäre aber "return s1!=s2;" korrekter). Aber da ich nicht vermute, daß du damit dein Problem richtig modelliert hast - wechsle lieber auf Gleitkomma-Arithmetik, dann macht die Division auch wieder Sinn.


Log in to reply