Der folgende Code funktioniert wie erwartet (der Test besteht), aber ich frage mich, ob die Arbeit mit Iteratoren auf diese Weise als eine schlechte Praxis in C++ oder wenn es in Ordnung ist.Anfügen eines std :: vector mit seinen eigenen Elementen mit Iteratoren
Vielleicht ist dies spezifisch für std::vector
und andere Sammlungen verhalten sich anders und Best Practices variieren zwischen Sammlungen (oder sogar ihre Implementierungen)?
Es ist sicherlich nicht in anderen Sprachen in Ordnung und die meiste Zeit ändern eine Sammlung Iteratoren ungültig und Ausnahmen auslösen.
BOOST_AUTO_TEST_CASE (ReverseIteratorExample) {
std::vector<int> myvector;
for(int i = 0; i < 5; i++)
{
myvector.push_back(i);
}
// is this generally a bad idea to change the vector while iterating?
// is it okay in this specific case?
myvector.reserve(myvector.size() + myvector.size() - 2);
myvector.insert(myvector.end(), myvector.rbegin() + 1, myvector.rend() -1);
int resultset [8] = { 0,1,2,3,4,3,2,1 };
std::vector<int> resultVector(resultset, resultset + sizeof(resultset)/sizeof(resultset[0]));
BOOST_CHECK_EQUAL_COLLECTIONS(myvector.begin(), myvector.end(), resultVector.begin(), resultVector.end());
}
Zusammengefasst Fragen:
- Ist dies in der Regel eine schlechte Idee, den Vektor während Iterieren zu ändern?
- Ist es in diesem speziellen Fall in Ordnung?
- Ist dies spezifisch für
std::vector
und andere Sammlungen verhalten sich anders? - Unterscheiden sich Best Practices zwischen Sammlungen (oder sogar deren Implementierungen)?
Es ist wirklich interessant, so Frage und ihre Antworten, auf die ich immer beziehen, wenn im Zweifel: http://stackoverflow.com/questions/4114503/rules-for-iterator-invalidation Es listet Standard C++ Container und der Fall, in dem Iteratoren ungültig oder noch gültig sind. (die Ihre Punkte 3 und 4 beantwortet.) –
In Bezug auf # 4: verwenden Sie 'std :: list' – TemplateRex