簡體   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