我的主要问题是如何在C ++中轻松地将对象从一个向量交换到另一个向量。因此,将一个对象添加到一个向量并将其从另一个向量中删除。
更确切地说:我正试图以下列方式迭代细胞网格:
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;
}
}
有没有人有任何建议如何以这种方式轻松交换细胞? (网格很大,所以也欢迎任何性能提示)
答案 0 :(得分:0)
你拥有的代码就是它。 std::vector
连续存储其所有内容,因此您需要“交换”需要复制数据。
您可能有资格进行移动优化,但您保留currentCell
。不过,您可以从要移除的位置移动到本地,从那里移动到新位置。目前还不清楚你的Cell
对象的移动操作是否比副本便宜,所以这对你来说无关紧要。
如果要删除有效元素,则应使用针对元素删除进行优化的数据结构。如果您还需要记住广告订单,那么std::list
可能会很好。如果不需要订购,则std::unordered_set
。
从您的算法描述中,我怀疑std::unordered_set
是最佳选择。
答案 1 :(得分:0)
如果要交换两个向量v1和v2的内容,可以使用
v1.swap(v2)
来自算法库。