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

Posted

技术标签:

【中文标题】尝试在 Python 中重写 C++ 代码时出现问题:删除地图中的项目和“vector.erase(vector.end())”【英文标题】:Problems when trying to rewrite C++ code in Python: delete item in map and "vector.erase(vector.end())" 【发布时间】:2019-03-05 15:21:16 【问题描述】:

我没有 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),则应从映射 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());
    

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

但是最后一句我没看懂:好像没有尝试移除向量中的最后一个元素。那么它有什么作用呢?代码运行正常。

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

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

感谢大家的解决方案!

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

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

再次感谢大家! :D

【问题讨论】:

我根本不懂python,但sampleMap.copy().items() 看起来应该是sampleMap.items(),因为你不想修改地图的副本。 我建议您将这些问题作为两个单独的问题发布。只需从这个问题中删除问题 2 并更改标题,然后为问题 2 制作一个新问题。SO 喜欢每个问题一种问题的格式。 旁注:if的整个第一个分支,在第一个例子中,可以简化为l = sampleMap.erase (l); 为什么您认为您的 python 代码不起作用?你得到什么输出,你期待什么?什么是输入地图?请出示minimal reproducible example @NathanOliver 因为如果我在迭代期间修改原始地图,那么我会得到一个错误:P 所以我循环复制一个并修改原始地图。 【参考方案1】:

问题 1

你可能只使用dictionary comprehension:

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

问题 2

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

【讨论】:

谢谢!对于问题 2,我尝试在我的 python 代码中删除 sampleVector 的最后一项,然后它运行正确:O 但我同意你的观点,vector.erase(vector.end()) 在 C++ 中应该是未定义的行为。无论如何,我将打开一个新帖子来讨论这个问题。感谢您抽出时间来帮助我! :D

以上是关于尝试在 Python 中重写 C++ 代码时出现问题:删除地图中的项目和“vector.erase(vector.end())”的主要内容,如果未能解决你的问题,请参考以下文章

在python中使用链接库中的方法时出现属性错误

FLTK:重写 FL_box 构造函数。 C++

在 Python 2.7 中编织内联 C++ 代码

尝试在 Visual Studio 2013-15 中从 C++ 执行 python 脚本时出现导入错误

尝试不重写文件并将其保存在 C# 的新位置时出现意外的系统异常

将python代码转换为c ++时出现opencvcornerSubPix异常