![](/img/trans.png)
[英]Problems passing a std::vector of vector of boost::shared_ptrs from C++ to Python
[英]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
的向量,两个名为constantOne
和constantTwo
。
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.