J'ai quelques expressions booléennes à évaluer et à traiter. Peut-être que tout cela aurait été mieux avec Boost, mais j'apprends encore le STL et je ne suis pas allé comme ça. J'apprends maintenant sur la validation d'itérateur, ou l'INvalidation selon le cas. Y at-il un moyen d'insérer un nouvel élément dans ce vecteur imbriqué ci-dessous en toute sécurité? Si vous ne voulez pas voir un homme pleurer, ne pas suggérer que je réécris tout :) En toute sincérité, je serais également heureux de suggestions pour la façon de réécrire cela d'une manière plus élégante après Je fixe mon plus immédiat problème, qui je soupçonne est un itérateur invalidé ...Comment insérer dans un vecteur imbriqué sans invalider l'itérateur (s)
... Je ne suis pas terriblement préoccupé par la performance. Basé sur cela et en lisant à travers d'autres messages, peut-être un std::List
à la place de std::vector
serait mieux, mais aurais-je besoin de cela à tous les niveaux de l'imbrication?
----nested.h
#include <vector>
struct Term {
uint32_t termNumber;
std::string content;
uint32_t importance;
uint32_t numAppearances;
uint32_t ContextFlags;
};
struct SubClause {
std::string typeName;
std::vector<Term> terms;
std::string clauseExpression;
};
struct Clause {
std::vector<SubClause> subClauses;
};
-----nested.cpp
#include <iostream>
#include "nested_container.h"
int main (int argc, char * const argv[]) {
std::vector<Clause> expression;
std::vector<Clause>::iterator clauseIter = expression.begin();
std::vector<Clause>::iterator clauseEnd = expression.end();
for(; clauseIter != clauseEnd ; clauseIter++)
{
std::vector<SubClause>::iterator subIter = clauseIter->subClauses.begin();
std::vector<SubClause>::iterator subEnd = clauseIter->subClauses.end();
for(; subIter != subEnd ; subIter++)
{
std::vector<Term>::iterator termIter = subIter->terms.begin();
std::vector<Term>::iterator termEnd = subIter->terms.end();
for(; termIter != termEnd ; termIter++)
{
/* Evaluate SubClause Terms based on some criteria
*/
/* if criteria true */
if(true/* criteria true? */)
{
Term newTerm = { };
/* fillOutTerm(newTerm) */
/* Invalidates the subIter pointer, pretty sure. Anything else???? */
subIter->terms.push_back(newTerm); //BAD?
}
}
}
}
return 0;
}
double possible de [règles Iterator invalidation] (http://stackoverflow.com/questions/6438086/iterator-invalidation-rules) –