Проблемы при попытке переписать код C ++ в Python: удалить элемент на карте и "vector.erase (vector.end ())" - PullRequest
1 голос
/ 05 марта 2019

У меня нет опыта работы с C ++, но в последнее время мне нужно переписать проект C ++ на Python. Я столкнулся с несколькими проблемами, которые мне не удалось решить, и некоторые из них приведены ниже:

Задача 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) должна быть удалена с карты sampleMap, если размер значения (фактически вектора) меньше, чем целое число (anConstant).

Итак, я переписал код на 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());
    }
}

В моем понимании код говорит, что при циклическом отображении карты sampleMap, если условие в операторе if выполнено, тогда сделайте размер (key, value) новой парой и добавьте пару в sampleVector.

Но я не понимаю последнее предложение: похоже, что оно не пытается удалить последний элемент в векторе. Так что же это делает? Код работает правильно.

Пожалуйста, помогите мне понять код C ++. Спасибо!

================ EDIT ==================

Спасибо всем за решение!

Для проблемы 1, после тестирования кода c ++ и кода python я обнаружил, что код python работает хорошо. Во всяком случае, я убедился, что означает код c ++, я многому научился: P

Для проблемы 2, я все еще не знаю, что sampleVector.erase(sampleVector.end()) делает здесь, но я попытался переписать его как del sampleVector[-1] (чтобы удалить последний элемент sampleVector) здесь, и результат был таким же, как и у С ++ код. Как странно это! Я открою новый пост, чтобы обсудить эту проблему и дам новую ссылку здесь.

Еще раз спасибо всем! : D

1 Ответ

0 голосов
/ 05 марта 2019

Задача 1

Вероятно, вы можете просто использовать толкование словаря :

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

Задача 2

Похоже на неопределенное поведение.В лучшем случае sampleVector.erase(sampleVector.end()) ничего не делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...