2016-09-26 17 views
1

Gibt es eine saubere Art, die Elemente eines Sets daraus zu entfernen? Etwas wie:C++ 11, ein Set retten

set<A> s {...}; 
vector<A> v; 
for (const A& a : s) 
    v.push_back(move(const_cast<A&>(a))); 
s.clear(); //undefined behavior? 
+0

habe ich einen Einschlag etwas, das die Elemente des Satzes ändert UB ist, wie Sie die Bestellung brechen. – NathanOliver

+1

http://en.cppreference.com/w/cpp/iterator/move_iterator – Caleth

+0

zu schlecht std :: set :: Erase gibt nicht zurück T && – Bwmat

Antwort

5

In C++ 11, nein. Die Bewegung, die du machst, ist ein undefiniertes Verhalten.

In C++ 17, ja, mit extract():

for (auto it = s.begin(); it != s.end();) { 
    v.push_back(std::move(s.extract(it++).value())); 
} 
s.clear();