[英]How to convert "Set functions" such as removeAll and addAll from Java to C++? Can it be done using erase or insert?
我一直在嘗試將 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++,或者是否有另一種方法可以相互添加集合並刪除它們。
提前致謝!
第一個需要像這樣的開始和結束迭代器:
currentState.insert(allTransitions.begin(), allTransitions.end());
如果在std::set
(您可以將其轉換為函數),則使用 for 循環最容易執行第二個:
for(const auto& t: allTransitions)
currentState.erase(t);
如果您在哪里對排序的std::vector/deque/list
等進行操作,您可以將 set 函數用於第二個操作( std::set_difference/set_intersection
等)
按照 Viktor 的回答,您可以使用std::set_difference
刪除元素(但循環是更干凈的替代方案)
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))
),但是還有額外的副本。 需要進行分析才能真正確定哪個更快。 循環當然更具可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.