繁体   English   中英

尝试在Python中重写C ++代码时出现问题:删除map和“ vector.erase(vector.end())”中的项目

[英]Problems when trying to rewrite C++ code in Python: delete item in map and “vector.erase(vector.end())”

我没有C ++的经验,但是最近需要用Python重写C ++项目。 我遇到了一些无法解决的问题,其中一些如下:

问题1

假设在C ++代码中有一个地图sampleMap和一个整数anConstant

for (typename map <string, vector <pair <unsigned int, int> > >::iterator l = sampleMap.begin(); l != sampleMap.end(); ) {
    if (l->second.size() < anConstant) {
        typename map <string, vector <pair <unsigned int, int> > >::iterator tmp = l;
        tmp = l; ++tmp; sampleMap.erase (l); l = tmp;
    } else {
        ++l;
    }
} 

以我的理解,代码的含义是,如果值(实际上是向量)的大小小于整数( anConstant(key, value)则应从地图sampleMap删除(key, value)对。

所以我在下面重写了Python中的代码:

for key, value in sampleMap.copy().items():
    if len(value) < anConstant:
        del sampleMap[key]

但似乎它无法正常工作。 也许我误解了c ++代码的含义,有人可以帮助我理解c ++代码吗?

问题2

同样,假设有一个名为sampleMap的地图,一个名为sampleVector的向量,两个名为constantOneconstantTwo

for (typename map <string, vector <pair <unsigned int, int> > >::iterator l = sampleMap.begin(); l != sampleMap.end(); ++l) {
    if (sampleVector.size() - constantOne < constantTwo){
        sampleVector.push_back(make_pair <string, unsigned int> (l->first, l->second.size()));
        sampleVector.erase(sampleVector.end());
    }
}

以我的理解,代码是说, if满足if语句中的条件,则循环映射map sampleMap时,请将(key, value)的大小设置为新对,并将该对附加到sampleVector

但是我不明白最后一句话:它似乎并没有尝试删除向量中的最后一个元素。 那怎么办呢? 该代码正确运行。

请帮助我理解c ++代码。 谢谢!

===============编辑==================

谢谢大家的解决方案!

对于问题1,在测试了c ++代码和python代码后,我发现python代码运行良好。 无论如何,我确保了c ++代码的含义,我学到了很多:P

对于问题2,我仍然不知道sampleVector.erase(sampleVector.end())在这里做什么,但是我尝试将其重写为del sampleVector[-1] (以删除sampleVector的最后一项),并输出与c ++代码之一相同。 真奇怪! 我将打开一个新帖子来讨论此问题,并在此处提供新链接。

再次感谢大家! :D

问题1

您可能只需要使用字典理解即可

sampleMap = {key: value for (key, value) in sampleMap.items() if value[1] > anConstant}

问题2

看起来像未定义的行为。 在最佳情况下, sampleVector.erase(sampleVector.end())不会执行任何操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM