簡體   English   中英

如何將諸如 removeAll 和 addAll 之類的“設置函數”從 Java 轉換為 C++? 可以使用擦除或插入來完成嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM