在集之间交换(删除/添加)

时间:2014-10-15 14:54:27

标签: c++ vector set

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

更确切地说:我正试图以下列方式迭代细胞网格:

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

    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;
        }
    }
    

    有没有人有任何建议如何以这种方式轻松交换细胞? (网格很大,所以也欢迎任何性能提示)

2 个答案:

答案 0 :(得分:0)

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

您可能有资格进行移动优化,但您保留currentCell。不过,您可以从要移除的位置移动到本地,从那里移动到新位置。目前还不清楚你的Cell对象的移动操作是否比副本便宜,所以这对你来说无关紧要。

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

从您的算法描述中,我怀疑std::unordered_set是最佳选择。

答案 1 :(得分:0)

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

v1.swap(v2) 

来自算法库。