c++ - 与 std::vector 的 std::find 相比,std::remove 的性能如何?
问题描述
背景
我最近重构了一些将演员置于世界中的代码。每个房间一名演员。
我最初的实现使用一个封闭集std::vector
来跟踪不再可用的房间的索引:
void RoomsAndCorridorsMapGenerator::PlaceActors() noexcept {
const int room_count = static_cast<int>(rooms.size());
auto closed_set = std::vector<std::size_t>{};
closed_set.reserve(room_count);
for(auto* actor : _map->_actors) {
const auto room_idx = [&]() {
auto idx = static_cast<std::size_t>(MathUtils::GetRandomIntLessThan(room_count));
while(std::find(std::begin(closed_set), std::end(closed_set), idx) != std::end(closed_set)) {
idx = static_cast<std::size_t>(MathUtils::GetRandomIntLessThan(room_count));
}
closed_set.push_back(idx);
return idx;
}(); //IIIL
actor->SetPosition(IntVector2{rooms[room_idx].CalcCenter()});
}
}
那是:
- 生成随机索引。
- 在向量中搜索生成的索引。
- 如果找到,请转到步骤 1。
- 将新生成的房间索引添加到封闭集中。
- 对于每个参与者,从步骤 1 继续。
我重构的实现使用了一个开放集:
void RoomsAndCorridorsMapGenerator::PlaceActors() noexcept {
auto open_set = std::vector<std::size_t>{};
open_set.resize(rooms.size());
std::iota(std::begin(open_set), std::end(open_set), std::size_t{0u});
for(auto* actor : _map->_actors) {
const auto room_idx = [&]() {
auto idx = open_set[static_cast<std::size_t>(MathUtils::GetRandomIntLessThan(static_cast<int>(open_set.size())))];
open_set.erase(std::remove(std::begin(open_set), std::end(open_set), idx), std::end(open_set));
return idx;
}(); //IIIL
actor->SetPosition(IntVector2{rooms[room_idx].CalcCenter()});
}
}
IE:
- 根据房间数量预先生成可用索引列表。
- 从列表中选择一个随机值。
- 从列表中删除该值。
- 对于每个参与者,从步骤 2 继续。
这简化了代码和算法,但我不确定复杂性。
问题
std::find
向量与std::remove
时间和复杂度相比如何?
我不确定重复的附加/擦除删除习语是否也有效果。
解决方案
推荐阅读
- vba - MS Project VBA - 如何查找当前活动的任务过滤器?
- java - 如何在 CRUDRepository 中写入具有特定列名的计数实体
- javascript - 我想找到最有效的方式来填充车辆,基本上是满足车辆容量的不同组合
- javascript - csv.js:53 Uncaught (in promise) ReferenceError: [constant] is not defined
- node.js - 如何从 NodeJS API 的角度处理额外的 multer 文件上传?
- javascript - 如何通过使用ajax单击同一行上的另一个值来更改表的特定行的值
- r - 从参数构建标准 R 模型对象
- spring-boot - 用户的 findall () 角色存储库存在 StackOverflowError 问题。填充 data.sql
- hibernate - Hibernate:将一对多引用从非主键映射到主键
- android - 片段和活动之间沟通的最佳方式