![](/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.