如何在Qmap中迭代和插入项目?
How to Iterate and Insert Items in Qmap?
我有一个 Qmap,包含一些对象(它不是免费的),为了简单起见,假设我想将每个对象的子对象添加到 Qmap 中,所以我必须迭代 Qmap 并插入每个对象的子对象在那上面。我该怎么做?然而,真正的代码有点复杂:
// This parameterSearchList will be looped over to include the the parameters that are implicitly used in the function in the lists of function.
// This includes both parameter QProperties of random variables and decision variables and the parameters upstream.
// The type of the parameter is determined by down-casting a pointer of the types RRandomVariable, RDecisionVariable, RConstant and RResponse to the parameter, respectively.
// If the down-casting to -for example- RRandomVariable does not return a NULL pointer, then the type of this parameter is a random variable. Thus, the pointer is added to the list of random variables.
// Likewise, if the type of the parameter is determined to be RDecisionVarible, RConstant, or RResponse, again the pointer is added to the corresponding lists, which are theDecisionVariableList, theConstantList, and theResponseList.
QMap<QString,RParameter *> parameterSearchList = theExplicitParameterList;
int counter = 0;
QMap<QString, RParameter *>::iterator iter;
for (iter=parameterSearchList.begin(); iter != parameterSearchList.end(); ++iter) {
if (counter++ % 100 == 0) {
QCoreApplication::processEvents();
}
RParameter *parameterObject = iter.value();
// adding a lock for the parameter if it has not been added before
if (! theDependencyCalculationLockHash.contains(parameterObject))
theDependencyCalculationLockHash.insert(parameterObject, new QReadWriteLock());
// Down-casting a pointer with the type RRandomVariable to the parameter
RRandomVariable *randomVariableObject = qobject_cast<RRandomVariable *>(parameterObject);
// If the pointer is not NULL, then the type of the parameter is random variable. Thus, this parameter should be added to the list of random variables.
if (randomVariableObject) {
// If "theRandomVariableList" does not already contain this parameter ...
if (!theRandomVariableList.contains(randomVariableObject)) {
// Adding the parameter to the "theRandomVariableList"
theRandomVariableList.append(randomVariableObject);
// Adding the parameter QProperties of the random variable to the parameterSearchList
QList<RParameter *> tempParameterList = randomVariableObject->getParameterList();
for (int j = 0; j < tempParameterList.count(); j++) {
if (!parameterSearchList.contains(tempParameterList[j]->objectName())) {
parameterSearchList.insert(tempParameterList[j]->objectName(),tempParameterList[j]);
}
}
}
continue;
}
// Down-casting a pointer with the type RDecisionVariable to the parameter
RDecisionVariable *decisionVariableObject = qobject_cast<RDecisionVariable *>(parameterObject);
// If the pointer is not NULL, then the type of the parameter is decision variable. Thus, this parameter should be added to the list of decision variables.
if (decisionVariableObject) {
// If "theDecisionVariableList" does not already contain this parameter ...
if (!theDecisionVariableList.contains(decisionVariableObject)) {
// Adding the parameter to the "theDecisionVariableList"
theDecisionVariableList.append(decisionVariableObject);
// Adding the parameter QProperties of the decision variable to the parameterSearchList
QList<RParameter *> tempParameterList = decisionVariableObject->getParameterList();
for (int j = 0; j < tempParameterList.count(); j++) {
if (!parameterSearchList.contains(tempParameterList[j]->objectName())) {
parameterSearchList.insert(tempParameterList[j]->objectName(), tempParameterList[j]);
}
}
}
continue;
}
// Down-casting a pointer with the type RConstant to the parameter
RConstant *constantObject = qobject_cast<RConstant *>(parameterObject);
// If the pointer is not NULL, then the type of the parameter is constant. Thus, this parameter should be added to the list of constants.
if (constantObject) {
// If "theConstantList" does not already contain this parameter ...
if (!theConstantList.contains(constantObject)) {
// Adding the parameter to the "theConstantList"
theConstantList.append(constantObject);
}
continue;
}
}
这是你要找的吗:
- 不要直接迭代映射,获取
QMap
的键 QList<String>
列表并将其存储在变量中,然后按如下方式迭代此列表:
// Get the list of maps keys
QList<QString> keys = parameterSearchList.keys();
// iterate keys
for(QString p : keys){
// Down-casting a pointer with the type RRandomVariable to the parameter
RRandomVariable *randomVariableObject = qobject_cast<RRandomVariable *>(parameterSearchList[p]);
// If the pointer is not NULL, then the type of the parameter is random variable. Thus, this parameter should be added to the list of random variables.
if (randomVariableObject) {
// Iterate ParameterList
for(RParameter * param : randomVariableObject->getParameterList()) {
// Check if not already exist in parameterSearchList
// (optional if your sure that parameters are unique)
if(!parameterSearchList.contains(param->objectName())){
// add param to parameterSearchList
parameterSearchList.insert(param->objectName(), param);
}
}
}
}
希望对你有帮助。
我有一个 Qmap,包含一些对象(它不是免费的),为了简单起见,假设我想将每个对象的子对象添加到 Qmap 中,所以我必须迭代 Qmap 并插入每个对象的子对象在那上面。我该怎么做?然而,真正的代码有点复杂:
// This parameterSearchList will be looped over to include the the parameters that are implicitly used in the function in the lists of function.
// This includes both parameter QProperties of random variables and decision variables and the parameters upstream.
// The type of the parameter is determined by down-casting a pointer of the types RRandomVariable, RDecisionVariable, RConstant and RResponse to the parameter, respectively.
// If the down-casting to -for example- RRandomVariable does not return a NULL pointer, then the type of this parameter is a random variable. Thus, the pointer is added to the list of random variables.
// Likewise, if the type of the parameter is determined to be RDecisionVarible, RConstant, or RResponse, again the pointer is added to the corresponding lists, which are theDecisionVariableList, theConstantList, and theResponseList.
QMap<QString,RParameter *> parameterSearchList = theExplicitParameterList;
int counter = 0;
QMap<QString, RParameter *>::iterator iter;
for (iter=parameterSearchList.begin(); iter != parameterSearchList.end(); ++iter) {
if (counter++ % 100 == 0) {
QCoreApplication::processEvents();
}
RParameter *parameterObject = iter.value();
// adding a lock for the parameter if it has not been added before
if (! theDependencyCalculationLockHash.contains(parameterObject))
theDependencyCalculationLockHash.insert(parameterObject, new QReadWriteLock());
// Down-casting a pointer with the type RRandomVariable to the parameter
RRandomVariable *randomVariableObject = qobject_cast<RRandomVariable *>(parameterObject);
// If the pointer is not NULL, then the type of the parameter is random variable. Thus, this parameter should be added to the list of random variables.
if (randomVariableObject) {
// If "theRandomVariableList" does not already contain this parameter ...
if (!theRandomVariableList.contains(randomVariableObject)) {
// Adding the parameter to the "theRandomVariableList"
theRandomVariableList.append(randomVariableObject);
// Adding the parameter QProperties of the random variable to the parameterSearchList
QList<RParameter *> tempParameterList = randomVariableObject->getParameterList();
for (int j = 0; j < tempParameterList.count(); j++) {
if (!parameterSearchList.contains(tempParameterList[j]->objectName())) {
parameterSearchList.insert(tempParameterList[j]->objectName(),tempParameterList[j]);
}
}
}
continue;
}
// Down-casting a pointer with the type RDecisionVariable to the parameter
RDecisionVariable *decisionVariableObject = qobject_cast<RDecisionVariable *>(parameterObject);
// If the pointer is not NULL, then the type of the parameter is decision variable. Thus, this parameter should be added to the list of decision variables.
if (decisionVariableObject) {
// If "theDecisionVariableList" does not already contain this parameter ...
if (!theDecisionVariableList.contains(decisionVariableObject)) {
// Adding the parameter to the "theDecisionVariableList"
theDecisionVariableList.append(decisionVariableObject);
// Adding the parameter QProperties of the decision variable to the parameterSearchList
QList<RParameter *> tempParameterList = decisionVariableObject->getParameterList();
for (int j = 0; j < tempParameterList.count(); j++) {
if (!parameterSearchList.contains(tempParameterList[j]->objectName())) {
parameterSearchList.insert(tempParameterList[j]->objectName(), tempParameterList[j]);
}
}
}
continue;
}
// Down-casting a pointer with the type RConstant to the parameter
RConstant *constantObject = qobject_cast<RConstant *>(parameterObject);
// If the pointer is not NULL, then the type of the parameter is constant. Thus, this parameter should be added to the list of constants.
if (constantObject) {
// If "theConstantList" does not already contain this parameter ...
if (!theConstantList.contains(constantObject)) {
// Adding the parameter to the "theConstantList"
theConstantList.append(constantObject);
}
continue;
}
}
这是你要找的吗:
- 不要直接迭代映射,获取
QMap
的键QList<String>
列表并将其存储在变量中,然后按如下方式迭代此列表:
// Get the list of maps keys
QList<QString> keys = parameterSearchList.keys();
// iterate keys
for(QString p : keys){
// Down-casting a pointer with the type RRandomVariable to the parameter
RRandomVariable *randomVariableObject = qobject_cast<RRandomVariable *>(parameterSearchList[p]);
// If the pointer is not NULL, then the type of the parameter is random variable. Thus, this parameter should be added to the list of random variables.
if (randomVariableObject) {
// Iterate ParameterList
for(RParameter * param : randomVariableObject->getParameterList()) {
// Check if not already exist in parameterSearchList
// (optional if your sure that parameters are unique)
if(!parameterSearchList.contains(param->objectName())){
// add param to parameterSearchList
parameterSearchList.insert(param->objectName(), param);
}
}
}
}
希望对你有帮助。