gpt4 book ai didi

c++ - 如何在不使迭代器无效的情况下插入嵌套 vector

转载 作者:行者123 更新时间:2023-11-30 04:40:08 25 4
gpt4 key购买 nike

我有一些 bool 表达式需要评估和处理。也许使用 Boost 会更好,但我仍在学习 STL,并没有走那条路。我现在正在学习迭代器验证,或 INvalidation 视情况而定。有没有办法安全地将新元素插入下面的嵌套 vector 中?如果您不想看到一个成年人哭泣,请不要建议我重写所有内容:) 说真的,我也欢迎您提出有关如何以更优雅的方式重写此内容的建议之后我解决了更紧迫的问题,我怀疑这是一个无效的迭代器...

...我不是很关心性能。基于此并阅读其他帖子,也许 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;
}

最佳答案

当您push_back 进入一个 vector 时,您(可能)使迭代器无效进入那个 vector ,但如果该 vector 恰好是另一个 vector 中的项目之一,迭代器进入另一个载体不受影响。

另一方面,在这种情况下,下标似乎(至少对我而言)产生的代码比迭代器短得多、更简单、更干净:

for (i=0; i<clause.size(); i++) {
std::vector<term> &terms = clause[i].terms;
for (j=0; j<terms.size(); j++)
if (criteria)
terms.push_back(term(x, y, z));
}

在这种情况下,使用迭代器对我来说是一种净损失。如果足够小心,他们会让您将数据存储在 std::list 中(例如),但这似乎(在这种情况下)无法补偿额外的长度和阅读困难。迭代器对于可以合理地应用于各种容器的通用算法非常有用,但除此之外它们通常收效甚微或一无所获。

除此之外,vector::size() 可以(至少在理论上)具有线性复杂度,因此对于实际代码,您可能希望提升对size() 跳出各自的循环。

关于c++ - 如何在不使迭代器无效的情况下插入嵌套 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1767979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com