У меня есть несколько логических выражений для оценки и обработки. Возможно, с Boost все было бы лучше, но я все еще изучаю STL и не пошел по этому пути. Сейчас я изучаю проверку итератора или INvalidation, в зависимости от обстоятельств. Есть ли способ безопасно вставить новый элемент в этот вложенный вектор ниже? Если вы не хотите, чтобы взрослый мужчина плакал, не предлагайте мне все переписать :) Если серьезно, я бы также приветствовал предложения о том, как переписать это более элегантно after Я исправляю свою более насущную проблему, которая, как я подозреваю, является недействительным итератором...
... Я не очень беспокоюсь о производительности. Основываясь на этом и читая другие сообщения, возможно, std::List
вместо std::vector
было бы лучше, но нужно ли мне это на каждом уровне вложенности?
----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;
}