在带有虚拟变量的循环内切片std :: vector的最佳方法

时间:2018-06-20 22:06:31

标签: c++ loops stdvector

我具有遍历结构向量的通用代码结构,对结构进行一些操作,并将其附加到新的结构向量上。然后,我对新的结构向量进行排序。

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结果,因此我可以使用优先级队列。但是有关存储中间结果的哑变量的问题仍然存在。

1 个答案:

答案 0 :(得分:4)

这应该有效:

// 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);