使用虚拟变量对 std::vector 内部循环进行切片的最佳方法



我有一个通用的代码结构,它迭代结构向量,对结构体执行一些操作,并将它们附加到新的结构向量。 然后我对结构的新向量进行排序。

vec<myStruct> now
now.push_back(someStruct)
for (i = 0; i < end; i++){
vec<myStruct> next;
for (j = 0; j < now.size(); j++){
for (k = 0; k < end_k; k++){
myStruct anotherStruct = now[j];
anotherStruct = somefunction(anotherStruct, k);
next.push_back(anotherStruct);
}
}
std::sort(next.begin(), next.end(), myComparitor);
//return top_n structs from vec<myStruct>
vec<myStruct> dummy;
for (i = 0; i < limit; i++){
dummy.push_back(next[i]);
}
now = dummy;
}

我的问题主要在于我创建一个采用 top-n 结构的虚拟向量的最后一部分:

//return top_n structs from vec<myStruct>
std::sort(next.begin(), next.end(), myComparitor);
vec<myStruct> dummy;
for (i = 0; i < limit; i++){
dummy.push_back(next[i]);
}
now = dummy;

有没有更有效的方法来从排序的向量中切片? 更具体地说,我质疑使用虚拟向量来存储前 n 个结果。 现在,我想说std::sort应该被认为是一些通用的排序算法(不是字面意思(。 由于需要 top-n 结果,我可以使用优先级队列。 但是关于用于存储中间结果的虚拟变量的问题仍然存在。

这应该有效:

// sort only first limit elements
std::partial_sort(next.begin(), next.begin() + limit, next.end(), myComparator);
// truncate
next.resize(limit);
// update now
now = std::move(next);

最新更新