Vector leeren



  • Swap? theVector.clear() reicht.

    Edit: Wobei std::vector().swap(vec); auch interessant aussieht, aber welche Vorteile hat das?





  • swap() zum Leeren würde ich allerdings nur einsetzen, wenn es relevante Vorteile bringt. Es hat schon seine Gründe, warum clear() den Speicher nicht freigibt.



  • Würde nicht clear() gefolgt von resize(0) auch reichen? Als Grund stattdessen swapp/erase zu nutzen würde mir höchstens einfallen das andere STL Container kein resize() bieten und das somit für refaktoring günstiger wäre? Mhh vektor, list, deque bieten resize an, map, multimap und queue nicht - dafür habe map und multimap eigene swap Implementationen 😕

    Edith: Ok, swap with temporary reduziert den Speicher auf 0, clear/resize löscht alles, gibt aber keien reservierten Speicher frei 🙂



  • Würde nicht clear() gefolgt von resize(0)

    Nein. Das ist nicht dasselble wie swap with a temporary.



  • Resultat nachdem man mich mit der Nase reinstieß: swap mit temporary != clear();resize(); da letzteres keinen reservierten Speicher freigibt.

    class Elem
    {
        static int count_default;
        static int count_copy;
        static int count_opEqual;
        static int count_destruct;
    
    public:
        Elem()                           { ++count_default;  }
        Elem(const Elem & e)             { ++count_copy;     }
        Elem & operator=(const Elem & o) { ++count_opEqual;  return *this; }
        ~Elem()                          { ++count_destruct; }
    
        static void output()
        {
            std::cout << "DefaConst\tCopyConst\toperEqual\tDestructor\n" << count_default << "\t" << count_copy << "\t"<< count_opEqual << "\t"<< count_destruct << "\n\n\n" << std::endl;
            count_default=0;
            count_copy=0;
            count_opEqual=0;
            count_destruct=0;
        }
    };
    
    int Elem::count_default(0);
    int Elem::count_copy(0);
    int Elem::count_opEqual(0);
    int Elem::count_destruct(0);
    
    int main()
    {
        std::cout << "just out of scope:\n";
        {
            std::vector<Elem> es;
            // es.reserve(100); // 2. Ausgabe
            for (int i=0; i< 100; ++i) es.push_back(Elem());
        }
        Elem::output();
    
        std::cout << "clear and resize:\n";
        {
            std::vector<Elem> es;
            es.reserve(100);
            for (int i=0; i< 100; ++i) es.push_back(Elem());
    
            int cap_before = es.capacity();
            es.clear();
            es.resize(0);
            std::cout << "Capacity before/after: " << cap_before << "/" << es.capacity()<< std::endl;
        }
        Elem::output();
    
        std::cout << "swap with temoprary:\n";
        {
            std::vector<Elem> es;
            es.reserve(100);
            for (int i=0; i< 100; ++i) es.push_back(Elem());
    
            std::cout << es.capacity()<< std::endl;
            int cap_before = es.capacity();
            std::vector<Elem>().swap(es);
            std::cout << "Capacity before/after: " << cap_before << "/" << es.capacity()<< std::endl;
        }
        Elem::output();
    
    }
    
    CopyConst und Destructor: ohne/mit es.reserve(100);
    
    just out of scope:
    DefaConst    CopyConst    operEqual    Destructor
    100          227/100          0            327/200
    
    clear and resize:
    Capacity before/after: 100/100
    DefaConst    CopyConst    operEqual    Destructor
    101          227/100          0            328/201
    
    swap with temoprary:
    Capacity before/after: 100/0
    DefaConst    CopyConst    operEqual    Destructor
    100          227/100          0            327/200
    


  • padreigh schrieb:

    Würde nicht clear() gefolgt von resize(0) auch reichen?

    Das resize bringt da gar nichts. resize legt nur die Anzahl der Elemente fest, der reservierte Speicher wird aber nur verändert, wenn er vergößert werden muss.



  • ipsec schrieb:

    padreigh schrieb:

    Würde nicht clear() gefolgt von resize(0) auch reichen?

    Das resize bringt da gar nichts. resize legt nur die Anzahl der Elemente fest, der reservierte Speicher wird aber nur verändert, wenn er vergößert werden muss.

    Stimmt - ich habe die API wohl fehlinterpretiert:

    http://www.cplusplus.com/reference/stl/vector/resize/

    Change size
    Resizes the vector to contain sz elements. If sz is smaller than the current vector size, the content is reduced to its first sz elements, the rest being dropped.

    "the rest being dropped." beschränkt also nicht die Kapazität sondern nur den aktuellen Inhalt. Danke 🙂 wieder was gelernt.


Anmelden zum Antworten