【问题标题】:Swap (remove/add) between sets在集合之间交换(删除/添加)
【发布时间】:2014-10-15 14:54:27
【问题描述】:

我的主要问题是如何在 C++ 中轻松地将对象从一个向量交换到另一个向量。因此,将一个对象添加到一个向量并从另一个向量中删除它。

更准确地说:我正在尝试以以下方式遍历单元格网格:

  1. 将所有单元格添加到未知集中(并将一个起始单元格添加到已知集中)
  2. 将已知单元格的邻居添加到候选集中(并从未知集中删除)
  3. 选择候选集中具有最低值的单元格并将其添加到已知集中(并将其从候选集中删除)
  4. 选择这个最低的单元格并返回到第 2 步
  5. 如果未知集为空;退出。

草率的伪代码:

vector<Cell> knownset = vector<Cell>();
vector<Cell> unknownset = vector<Cell>();
vector<Cell> candidateset = vector<Cell>();
Cell currentCell = some_cell;
// Iterate until all cells are known
while (unknownset.size() > 0){
    for each (direction in directions){
        c = currentCell+direction;
        // Add cell to candidate set
        candidateset.push_back(c);
        // Remove cell from unknown set
        unknownset.remove(c);
        // Search the cell with the lowest value
        for each( candidate in candidateset ){
            if ( candidate.value < lowestValue ){
                lowestValue = candidate.value;
                lowestCell = candidate;
            }
        }
        // Remove the cell with the lowest value
        knownset.push_back(lowestCell);
        candidateset.remove(lowestCell);
        currentCell = lowestCell;
    }
}

有人对如何以这种方式轻松交换单元格有任何建议吗? (网格比较大,也欢迎大家给点性能建议)

【问题讨论】:

  • 您尝试将std::swap 包含在&lt;algorithm&gt; 中吗?
  • @Caduchon:你会交换哪两个对象?

标签: c++ vector set


【解决方案1】:

您拥有的代码就是它。 std::vector 连续存储其所有内容,因此您的“交换”必要时需要复制数据。

您可能有资格进行移动优化,除非您保留currentCell。不过,您可以从您要移除的位置移动到本地,然后从那里移动到新位置。尚不清楚您的 Cell 对象是否具有比副本便宜的移动操作,因此这对您来说可能无关紧要。

如果您想要有效地删除元素,则应使用针对元素删除进行了优化的数据结构。如果您还需要记住插入顺序,那么std::list 可能会很好。如果不需要订购,那么std::unordered_set

从你的算法描述来看,我怀疑std::unordered_set 是最好的选择。

【讨论】:

    【解决方案2】:

    如果要交换两个向量v1和v2的内容,可以使用

    v1.swap(v2) 
    

    来自算法库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      • 2013-06-12
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      相关资源
      最近更新 更多