在迭代集合时,最有效的删除方式是什么?我想到了两种方法,哪个更好?还有其他更好的方法吗?
void WaitForFiles(std::set<string> files) {
while (files.size() > 0) {
std::set<string> found_files;
for (const auto& file : files) {
if (Exists(file)) {
found_files.insert(file);
}
}
for (const auto& found_file : found_files) {
files.erase(file);
}
}
}
使用 set_difference:
void WaitForFiles(std::set<string> files) {
while (files.size() > 0) {
std::set<string> found_files;
for (const auto& file : files) {
if (Exists(file)) {
found_files.insert(file);
}
}
std::set<string> difference;
std::set_difference(files.begin(), files.end(),
found_files.begin(), found_files.end(),
std::inserter(difference, difference.end()));
files = difference;
}
}
请注意以下崩溃情况:
void WaitForFiles(std::set<string> files) {
while (files.size() > 0) {
for (const auto& file : files) { // <-- seg fault after first erase
if (Exists(file)) {
files.erase(file);
}
}
}
}
对于确定效率,请记住,在我的情况下,文件可能需要30分钟才能存在,因此Exists函数将被调用多次,并且与循环迭代的次数相比,文件集合不会经常更改。
found_files
从一个set
改为一个vector
。 - Mark Ransomerase
方法返回的新迭代器。 - Jonathan Potterfound_files
的方式中没有任何优势。但是Chris Drew的答案向你展示了如何完全消除它,这是100%更好的。 - Mark Ransom