首页 > 解决方案 > 尝试在 Python 中重写 C++ 代码时出现问题:删除地图中的项目和“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;
    }
} 

在我的理解中,代码的意思是如果值(实际上是向量)的大小小于整数(),则(key, value)应该从映射中删除一对。sampleMapanConstant

所以我在下面用 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());
    }
}

在我的理解中,代码是说,如果满足语句中sampleMap的条件,则在循环映射时,将's 的大小设置为一个新对并将该对附加到.if(key, value)sampleVector

但是最后一句没看懂:好像没有尝试去掉vector中的最后一个元素。那么它有什么作用呢?代码运行正确。

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

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

谢谢大家的解决方案!

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

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

再次感谢大家!:D

标签: pythonc++dictionaryvector

解决方案


问题 1

您可能只使用字典理解

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

问题 2

看起来像未定义的行为。在最好的情况下,sampleVector.erase(sampleVector.end())什么都不做。


推荐阅读