Как преобразовать «Установить функции», такие как removeAll и addAll из Java в C ++? Это можно сделать с помощью стирания или вставки? - PullRequest
0 голосов
/ 29 марта 2020

Я пытался преобразовать код Java в C ++, и я наткнулся на эту часть кода, которая повторяется пару раз.

//JAVA
TreeSet<String> currentState = new TreeSet<String>();
TreeSet<String> allTransitions = new TreeSet<String>();
       .
       .
       .
currentState.addAll(allTransitions);
       .
       .
       .
currentState.removeAll(allTransitions);

Я пытался добиться того же в C ++ набрав следующий код:

//C++
set<string> currentState;
set<string> allTransitions;
       .
       .
       .
currentState.insert(allTransitions);
       .
       .
       .
currentState.erase(allTransitions);

Когда я пытаюсь скомпилировать этот код, я получаю много ошибок, поэтому мне интересно, возможно ли вообще легко реплицировать те же функции с Java на C ++, или Есть еще один способ добавить наборы друг к другу и удалить их.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

После ответа Виктора вы можете использовать std::set_difference для удаления элементов (но l oop является более чистой альтернативой)

std::set<std::string> tempCurrentState;
std::set_difference(currentState.begin(), currentState.end(), 
                    allTransitions.begin(), allTransitions.end(),
                    std::inserter(tempCurrentState, tempCurrentState.end()));

currentState = tempCurrentState;

Это может или миграция не должна быть немного быстрее (O(n + k) сложность времени, а не O(n*log(k))), но есть дополнительная копия. Профилирование потребуется, чтобы действительно определить, какой из них быстрее. L oop определенно более читабелен.

0 голосов
/ 29 марта 2020

Первому нужен начальный и конечный итератор, подобный следующему:

currentState.insert(allTransitions.begin(), allTransitions.end());

Второй легче всего выполнить с помощью for для l oop при работе на std::set (который можно превратить в функция):

for(const auto& t: allTransitions)
  currentState.erase(t);

Если вы работаете с отсортированным std::vector/deque/list et c, вы могли бы использовать установленные функции для второй операции (std::set_difference/set_intersection et c)

...