vector will nicht push_back machen (Typkonversion nötig?!?)



  • Hallo,

    ich habe da ein Problem mit einem Vector.
    Ich will hier ein Hash-Table / Dictionary erstellen und habe Probleme bei der push_back Operation. Ich glaube/befürchte, ich muss eine Typkonversion machen.

    Danke für eure Tipps!

    ...
    typedef int koord [2];
    static map<string, vector<int> > hotTable;

    ...
    ...

    void searchSpot(string query, int f, vector<koord> Hotspots_temp)
    {
    map<string, vector<int> >::iterator iter;
    iter = hotTable.find(query); // O(log(n)) 😞
    if (iter != hotTable.end()){
    for (int z=0; z<= iter->second.size()-1; ++z){
    koord HSgefunden = {iter->second.at(z), f};
    Hotspots_temp.push_back(HSgefunden); // hier kommt der Fehler (außerhalb der Datei):
    560 ...\include\c++\3.4.2\bits\stl_vector.h instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int[2], _Alloc = std::allocator<int[2]>]'

    }

    }
    }

    PS: benutze Dev-C++



  • Kannst du mal die komplette Fehlermeldung ausgeben? (aber es könnte ein Problem damit geben, daß "const int[2]&" nicht definiert ist)


  • Mod

    array-typedefs sind mit vorsicht zu geniessen (weil man ihnen das array-sein nicht ansieht). und arrays erfüllen die container-requirements nicht (Copy-Constructible/Assignable) - folglich ist ein std::vector<koord> ill-formed/UB.
    mach aus dem typedef ein struct und es müsste funktionieren.

    edit: boost:array bzw. std::tr1::array bieten sich auch an



  • danke für die schnelle antwort!!!



  • Hallo,

    ich dachte, der Fehler wäre behoben, ist er aber nicht. Nachdem ich das ganze Proggy umgeschrieben haben und andere Typen benutze, hängt es wieder an dem Vektor. Ich brauche den Cektor, um Koordinaten dynamische zu speichern. Deshalb habe ich mich für einen vector<int[2]> entschieden (geht das bzw gibts den überhaupt?!?). Aber da mackert mir der Compiler... diverse Fehler, die ich im folgenden aufliste:

    560 ...\Dev-Cpp\include\c++\3.4.2\bits\stl_vector.h instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int[2], _Alloc = std::allocator<int[2]>]'

    ...Dev-Cpp\include\c++\3.4.2\bits\vector.tcc In member function `void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = int[2], _Alloc = std::allocator<int[2]>]':

    564 ...\Dev-Cpp\include\c++\3.4.2\bits\stl_vector.h instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int[2], _Alloc = std::allocator<int[2]>]'

    ..ich hoffe auf Hilfe!!!



  • ...fehler nicht behoben schrieb:

    Deshalb habe ich mich für einen vector<int[2]> entschieden (geht das bzw gibts den überhaupt?!?).

    Wie camper oben sagte, geht das nicht - das Template benötigt bestimmte Operationen (z.B. einen Copy-Construktor für den Elementtyp), um instanziiert zu werden, und die hat ein C-Array leider nicht.

    Also solltest du dich anstelle von int[2] für einen anderen Typ entscheiden, um deine Koordinaten aufzunehmen - z.B. ein struct aus zwei int-Elementen:

    //Diese Struktur ist STL-tauglich ;)
    struct koord
    {
      int x,y;
    };
    


  • jetzt verstehe ich...

    danke

    PS: ich bin echt super erstaunt, dass man hier soooooooooooooo schnelle eine Antwort bekommt. TOLL



  • Hallo

    ...ich verstehe schrieb:

    PS: ich bin echt super erstaunt, dass man hier soooooooooooooo schnelle eine Antwort bekommt. TOLL

    Das geht mir uach immer so.

    chrische



  • Stellt nicht so einfache Fragen, dann kommen die Antworten nicht so schnell oder gar nicht. 😉


Anmelden zum Antworten